假设我有以下csv数据:
first_name,last_name
tom,hanks
tom,cruise
我想按如下方式转换此数据:
data = {
'first_name': ['tom','tom'],
'last_name': ['hanks', 'cruise']
}
执行上述操作的最佳方法是什么(不使用诸如pandas,numpy或csv之类的库)。
答案 0 :(得分:6)
我个人会选择pandas
或csv
,但这很容易实现,无需导入:
header = None
data = {}
for line in myfile:
lstrip = line.strip().split(",")
if not header:
header = lstrip
data = {k: [] for k in header}
else:
for i, value in enumerate(lstrip):
data[header[i]].append(value)
print(data)
#{'first_name': ['tom', 'tom'], 'last_name': ['hanks', 'cruise']}
答案 1 :(得分:2)
添加文件
>>> from io import StringIO
>>> file = StringIO('''first_name,last_name
...: tom,hanks
...: tom,cruise''')
创建字典:
>>> data = [(k, []) for k in next(file).strip().split(',')]
>>> for line in file:
...: for i, field in enumerate(line.strip().split(',')):
...: data[i][1].append(field)
...:
>>> data = dict(data)
>>> data
{'first_name': ['tom', 'tom'], 'last_name': ['hanks', 'cruise']}
这实际上是编程练习,而不是您在现实世界中应使用的解决方案。它根本不够健壮,并且会在各种常见情况下失败,例如在csv文件中用引号引起来的字段包含逗号。
使用csv
,供其他读者使用:
>>> import csv
>>> reader = csv.reader(file) # assume fresh StringIO instance
>>> dict(zip(next(reader), zip(*reader)))
{'first_name': ('tom', 'tom'), 'last_name': ('hanks', 'cruise')}
(如果将列表作为值很重要,请使用dict(zip(next(reader), map(list, zip(*reader))))
。)