数据输入:
[
{'a': 1, 'b': 2, 'c': 3},
{'b': 2, 'd': 4, 'e': 5, 'a': 1},
{'b': 2, 'd': 4, 'a': 1}
]
CVS输出(列顺序无关):
a, b, c, d, e
1, 2, 3
1, 2, , 4, 5
1, 2, , 4
标准库csv
模块无法覆盖这种输入。
是否有一些用于单方法导出的包或库?或者一个好的解决方案来处理列的差异?
使用附带的csv
模块,只需进行一些初步处理,就可以相当容易地完成。
import csv
data = [
{'a': 1, 'b': 2, 'c': 3},
{'b': 2, 'd': 4, 'e': 5, 'a': 1},
{'b': 2, 'd': 4, 'a': 1}
]
fields = sorted(set.union(*(set(tuple(d.keys())) for d in data))) # Determine columns.
with open('output.csv', 'w', newline='') as file:
writer = csv.DictWriter(file, fieldnames=fields)
writer.writeheader()
writer.writerows(data)
print('-fini-')
生成的文件内容:
a,b,c,d,e
1,2,3,,
1,2,,4,5
1,2,,4,
直接使用熊猫:
import pandas as pd
lst = [
{'a': 1, 'b': 2, 'c': 3},
{'b': 2, 'd': 4, 'e': 5, 'a': 1},
{'b': 2, 'd': 4, 'a': 1}
]
df = pd.DataFrame(lst)
print(df.to_csv(index=None))
输出:
a,b,c,d,e
1,2,3.0,,
1,2,,4.0,5.0
1,2,,4.0,
你必须传递一个restval参数给dicwriter这是字典中缺少键的默认参数
writer = Dictwriter(file, list('abcde'), restval='')