背景
我有多个不同长度的词典。我需要将字典的值写入单个 CSV 文件。我想我可以逐个循环遍历每个字典并将数据写入 CSV。我遇到了一个小格式问题。
问题/解决方案
我意识到在循环第一个字典后,第二个写入的数据被写入第一个字典结束的行,如第一张图像中显示的那样,我理想地希望我的数据打印如下在第二张图片
中我的代码
import csv
e = {'Jay':10,'Ray':40}
c = {'Google':5000}
def writeData():
with open('employee_file20.csv', mode='w') as csv_file:
fieldnames = ['emp_name','age','company_name','size']
writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
writer.writeheader()
for name in e:
writer.writerow({'emp_name':name,'age':e.get(name)})
for company in c:
writer.writerow({'company_name':company,'size':c.get(company)})
writeData()
PS:我有两个以上的字典,所以我正在寻找一种通用的方法,可以从所有字典的标题下的行打印数据。我愿意接受所有解决方案和建议。
最佳答案
如果所有字典大小相同,您可以使用 zip
并行迭代它们。如果它们的大小不相等,并且您希望迭代填充到最长的字典,则可以使用 itertools.zip_longest
例如:
import csv
from itertools import zip_longest
e = {'Jay':10,'Ray':40}
c = {'Google':5000}
def writeData():
with open('employee_file20.csv', mode='w') as csv_file:
fieldnames = ['emp_name','age','company_name','size']
writer = csv.writer(csv_file)
writer.writerow(fieldnames)
for employee, company in zip_longest(e.items(), c.items()):
row = list(employee)
row += list(company) if company is not None else ['', ''] # Write empty fields if no company
writer.writerow(row)
writeData()
如果字典大小相等,则更简单:
import csv
e = {'Jay':10,'Ray':40}
c = {'Google':5000, 'Yahoo': 3000}
def writeData():
with open('employee_file20.csv', mode='w') as csv_file:
fieldnames = ['emp_name', 'age', 'company_name', 'size']
writer = csv.writer(csv_file)
writer.writerow(fieldnames)
for employee, company in zip(e.items(), c.items()):
writer.writerow(employee + company)
writeData()
一个小旁注:如果您使用Python3,字典是有序的。 Python2 中并非如此。所以如果你使用Python2,你应该使用collections.OrderedDict
而不是标准字典。
关于python - 从多个字典写入单个 CSV 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52922226/