【问题标题】:Write dictionaries with different keys to CSV file将具有不同键的字典写入 CSV 文件
【发布时间】:2020-12-27 20:08:07
【问题描述】:

我有一些词典:

d1 = {'name':'jon','age':4}
d2 = {'name':'joe','age':34,'height':100}

我还有其他字典没有在这里列出,有一些不同的键,但它们有一些与d1d2 相同的键。

import csv
with open('file.csv', 'a') as f:
    wr = csv.writer(f) 
    wr.writerow(d1.values())
    wr.writerow(d2.values())

当然,这不会将数据放在正确的列中。它也不需要标题。我该如何设置,以便每个字典中的每个键都成为标题,并且在将信息写入 CSV 时将值放在正确的位置?

【问题讨论】:

  • 你在项目中使用 pandas 吗?
  • @adirabargil no

标签: python python-3.x csv dictionary


【解决方案1】:

尝试使用csv.DictWriter(f, fieldnames=csv_columns) 而不是csv.writer(f) 查看文档here。至于csv_columns,如果您事先不知道所有列名,您可以遍历所有字典找到唯一的并将它们添加到列表中。

我在下面写了一个例子。

import csv

d1 = {'name':'jon', 'age':4}
d2 = {'name':'joe', 'age':34, 'height':100}

csv_columns = ['name', 'age', 'height']

with open('file.csv', 'a') as f:
    wr = csv.DictWriter(f, fieldnames=csv_columns)
    wr.writeheader()
    wr.writerow(d1)
    wr.writerow(d2)

【讨论】:

    【解决方案2】:

    我认为处理这个问题的最佳方法是创建一个类来跟踪您添加到其中的所有 dicts,然后为您编写文件。

    这个类将允许您添加任意数量的字典,并将跟踪所有字段并将它们适当地添加到文件中。

    class CsvDictWriter:
        def __init__(self):
            self.dicts = []
            self.fields = set()
    
        def add_dict(self, obj: dict):
            self.dicts.append(obj)
            self.fields.update(obj.keys())
    
        def write(self, file_name: str):
            with open(file_name, 'w') as fp:
                dw = DictWriter(fp, self.fields, restval='')
                dw.writeheader()
                for obj in self.dicts:
                    dw.writerow(obj)
    
    
    d1 = {'name': 'jon', 'age': 4}
    d2 = {'name': 'joe', 'age': 34, 'height': 100}
    
    cdw = CsvDictWriter()
    cdw.add_dict(d1)
    cdw.add_dict(d2)
    cdw.write('file.csv')
    

    【讨论】:

      【解决方案3】:

      您将需要所有可能的键的列表以及您希望它们写入 csv 的顺序。您将无法“即时”构建文件,因为您不知道每个字典包含哪些键和顺序;除非您在开始将字典写入文件之前检查所有字典。

      使用标题列表(键)和DictWriter,您可以按照自己的方式处理每个标题并输出到文件。

      DiscWriter 类参数有一个restval,您将需要它,因为并非所有字典都有所有键。它被描述为:

      可选的 restval 参数指定字典在字段名中缺少键时要写入的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-15
        • 1970-01-01
        • 2019-07-02
        • 2023-03-03
        • 2015-09-09
        • 1970-01-01
        • 2020-01-25
        相关资源
        最近更新 更多