csv.DicReader()是否返回字典对象?

时间:2018-09-08 23:08:45

标签: python csv dictionary

当我尝试使用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 :(得分:1)

csv.reader

鉴于所需的输出,您不需要使用dictcsv.DictReader。而是使用csv.reader,它返回一个迭代器。然后分别使用nextlist提取标题和数据:

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'>

答案 1 :(得分:1)

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')])]