Python 从多个词典写入单个CSV文件

Python 从多个词典写入单个CSV文件,python,csv,dictionary,Python,Csv,Dictionary,背景 我有多本不同长度的字典。我需要将字典的值写入单个CSV文件。我想我可以一个接一个地遍历每个字典,然后将数据写入CSV。我遇到了一个小的格式问题 问题/解决方案 我意识到在我循环第一个字典之后,第二次写入的数据被写入第一个字典结束的行,如第一个图像所示 import csv e = {'Jay':10,'Ray':40} c = {'Google':5000} def writeData(): with open('employee_file20.

背景

我有多本不同长度的字典。我需要将字典的值写入单个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()

我的代码

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:我会有两个以上的字典,所以我正在寻找一种通用的方式,在这里我可以打印所有字典标题下的行中的数据。我对所有的解决方案和建议都持开放态度。

如果所有字典的大小相同,您可以使用它们并行迭代。如果它们的大小不相等,并且您希望迭代填充到最长的dict,那么您可以使用

例如:

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()
如果DICT大小相同,则更简单:

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,您应该使用而不是标准字典。

可能有一个更具python风格的解决方案,但我会这样做:

我以前没有使用过你的.csv编写器,所以我只做了自己的逗号分隔输出

e = {'Jay':10,'Ray':40}
c = {'Google':5000}
dict_list = [e,c] # add more dicts here.
max_dict_size = max(len(d) for d in dict_list)
output = ""
# Add header information here.
for i in range(max_dict_size):
  for j in range(len(dict_list)):
    key, value = dict_list[j].popitem() if len(dict_list[j]) else ("","")
    output += f"{key},{value},"
  output += "\n"
# Now output should contain the full text of the .csv file
# Do file manipulation here.
# You could also do it after each row,
# Where I currently have the output += "\n"
编辑:再多想一想,我发现一些东西可能会使这一点更加完美。您可以首先在每个字典上使用.key()函数将字典映射到一个键列表中,并将这些键附加到一个空列表中


这样做的好处是,您可以“前进”,而不是从后面弹出字典项。它也不会破坏字典。

我发布了一个后续问题,不确定你是否知道它的解决方案。