gpt4 book ai didi

用于动态 header 的 Python CSV 编写器

转载 作者:行者123 更新时间:2023-12-04 16:08:33 25 4
gpt4 key购买 nike

我有很多字典在键方面不一致,我必须将它们写入 CSV。

在使用 DictWriter 时,它需要在我不知道的声明中定义 header 。在我拥有所有 dict 之前,我也无法将它们存储在列表中,因为 dict 的数量达到数百万。

我正在寻找可以继续编写包含不一致行的 CSV 的库,它可以在后台管理它们。

数据:

{'a':'1','i':'1','l':None}
{'b':'1','k':'1','y':None}
{'g':'1','k':'1','j':None}
{'b':'1','h':'1','c':None}
{'b':'1','h':'1','n':None}
{'a':'1','b':'1','v':None}
{'a':'1','b':'1','c':None}

预期输出:(像这样的 CSV)

a   c   b   g   i   h   k   j   l   n   v   y
1 1
1 1
1 1
1 1
1 1
1 1
1 1

顶部的数据来自迭代器,无法将其存储在内存中,因为它非常大。

最佳答案

如果您不知道所有的 header 字段,并且您认为迭代字典的可迭代对象来收集 header 字段效率低下,那么您不应该使用 DictWriter

您可以改为跟踪所有看到的字段,按照它们出现在每个字典中的方式写入它们,并将新字段附加到每个新行的末尾;以便较新的字段位于文件中行的尾部。在新行中找不到的现有字段被写为空白。

这是演示该概念的 Python 3 玩具代码:

import io
import csv

# supposedly lengthy iterator containing dicts
it = iter([{'name': 'Bob', 'house': 5, 'cell': 8090},
{'name': 'Lisa', 'class': 12, 'age': 53},
{'done': False, 'flat': 6}])
# simulate file
s = io.StringIO()
writer = csv.writer(s)

header, header_set = [], set()
writer.writerow('') # place holder for header
for row in it:
for key in row:
if key not in header_set:
header_set.add(key)
header.append(key)
writer.writerow(row.get(col, '') for col in header)


# TEST: recover written file as iterable of dicts using DictReader
s.seek(0)
reader = csv.DictReader(s, fieldnames=header, restval='')
for row in reader:
print(row)

OrderedDict([('name', 'Bob'), ('house', '5'), ('cell', '8090'), ('class', ''), ('age', ''), ('done', ''), ('flat', '')])
OrderedDict([('name', 'Lisa'), ('house', ''), ('cell', ''), ('class', '12'), ('age', '53'), ('done', ''), ('flat', '')])
OrderedDict([('name', ''), ('house', ''), ('cell', ''), ('class', ''), ('age', ''), ('done', 'False'), ('flat', '6')])

如果您需要用标题更新现有文件,您可以将标题写入新文件,并将前一个文件中的所有行写入后续行:

new_file.write(','.join(header)+s.read())

但是,考虑到您最初声称行数相当大,您可以通过使用文件编辑器手动将标题复制到现有文件中来避免内存密集型 file.read :)

关于用于动态 header 的 Python CSV 编写器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47177115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com