Csv.DicReader () возвращает объект словаря? - PullRequest
0 голосов
/ 09 сентября 2018

Пока я пытаюсь использовать csv.DictReader() для передачи файла CSV в словарь, например:

csv_file = open(input_file, "r")
data = csv.DictReader(csv_file)

Однако я не могу применить какие-либо словарные методы к data.

Таким образом, я печатаю тип data.

print(type(data))

и найдите тип:

<class 'csv.DictReader'>

Так csv.DictReader() действительно возвращает объект словаря? Как я могу получить объект словаря от CSV ?

Мой CSV файл выглядит так:

[['play', 'weather', 'temperature'], ['yes', 'sunny', '77'], ['no', 'rainny', '60'], ['yes', 'windy', '70'],...]

На самом деле у меня нет ожидаемого выхода. Я просто хочу сохранить эти значения для дальнейшего расчета.

Редактировать (согласно комментарию): Вывод может состоять из двух частей. Первый - это заголовки файла csv, например ['play', 'weather', 'temperature']. Второй может быть таким: [['yes', 'sunny', '77'], ['no', 'rainny', '60'], ['yes', 'windy', '70']...]

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

DictReader возвращает файл-подобный объект. Он по-прежнему считывает данные из файла CSV по одной строке за раз, но возвращаемые строки представляют собой упорядоченные словари, а не списки.

Если ваши файлы:

play,weather,temperature
yes,sunny,77
no,rainny,60
yes,windy,70

Тогда вы можете использовать DictReader следующим образом:

with open('path/to/file.csv') as fp:
    header = fp.readline().strip().split(',')
    dreader = DictReader(fp, header)
    data = list(dreader)

В этом случае data будет список OrderedDict объектов с отображением из заголовков на каждый элемент в строке.

data
#returns:
[OrderedDict([('play', 'yes'), ('weather', 'sunny'), ('temperature', '77')]),
 OrderedDict([('play', 'no'), ('weather', 'rainny'), ('temperature', '60')]),
 OrderedDict([('play', 'yes'), ('weather', 'windy'), ('temperature', '70')])]
0 голосов
/ 09 сентября 2018

csv.reader

Учитывая желаемый результат, вам не нужно использовать dict или, следовательно, csv.DictReader. Вместо этого просто используйте csv.reader, который возвращает итератор. Затем используйте next и list для извлечения заголовков и данных соответственно:

from io import StringIO
import csv

x = StringIO("""play,weather,temperature
yes,sunny,77
no,rainy,60
yes,windy,70""")

# replace x with open('file.csv', 'r')
with x as fin:
    reader = csv.reader(fin)
    headers = next(reader)  # get headers from first row
    data = list(reader)     # exhaust iterator from second row onwards

Результатом является список заголовков и список списков для данных:

print(headers)

['play', 'weather', 'temperature']

print(data)

[['yes', 'sunny', '77'],
 ['no', 'rainy', '60'],
 ['yes', 'windy', '70']]

панд

Если вы хотите использовать стороннюю библиотеку, Pandas может быть лучшим вариантом, так как он более удобно обрабатывает преобразование типов и индексацию:

import pandas as pd

df = pd.read_csv('file.csv')

В результате получается объект pd.DataFrame:

print(df)

  play weather  temperature
0  yes   sunny           77
1   no   rainy           60
2  yes   windy           70

print(type(df))

<class 'pandas.core.frame.DataFrame'>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...