当我尝试使用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']...]
答案 0 :(得分:1)
鉴于所需的输出,您不需要使用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'>
答案 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')])]