如何将字典列表另存为CSV并保持键有序?



我有一个字典列表,需要将它们保存为CSV。第一行是列出字段名称的标题。

字段顺序应与标题中的顺序相同。问题是有些字段是可选的,而有些字典不包含它们。另一个问题是python不会按照定义的顺序迭代字典键。

import csv
import sys
fields = ['first_name', 'last_name', 'city']
dicts = [
{
"first_name": "John",
"last_name": "Doe",
"city": "New York",
},
{
"first_name": "Agent",
"last_name": "Smith",
"city": "Matrix",
},
]
csv_writer = csv.writer(sys.stdout)
csv_writer.writerow(fields)
for obj in dicts:
# fields order mismatch
csv_writer.writerow(obj.values())

这将生成与标题不匹配的 CSV 行。

first_name, last_name, city
New York,   John,      Doe
Matrix,     Agent,     Smith

我可以手动对字段进行排序并检查缺少的项目,但我想知道是否有更好的解决方案可以按预定义的顺序将字典值输出到 CSV 中?

使用 DictWriter(fieldnames列表中也有拼写错误:fisrt_name 而不是 first_name(:

import csv
import sys
fieldnames = ['first_name', 'last_name', 'city']
dicts = [
{
"first_name": "John",
"last_name": "Doe",
"city": "New York",
},
{
"first_name": "Agent",
"last_name": "Smith",
"city": "Matrix",
},
]
writer = csv.DictWriter(sys.stdout, fieldnames=fieldnames)
writer.writeheader()
for row in dicts:
writer.writerow(row)

接受的答案很棒,它利用了 python 标准库csv。我只是把我的答案放在这里(使用pandas方法(,以防它可以帮助某人。

In [12]: import pandas as pd
In [13]: dicts = [ 
...:     { 
...:         "first_name": "John", 
...:         "last_name": "Doe", 
...:         "city": "New York", 
...:     }, 
...:     { 
...:         "first_name": "Agent", 
...:         "last_name": "Smith", 
...:         "city": "Matrix", 
...:     }, 
...: ]                                                                                                                                                                                                         
In [14]: df = pd.DataFrame(dicts)                                                                                                                                                                                  
In [15]: df                                                                                                                                                                                                        
Out[15]: 
first_name last_name      city
0       John       Doe  New York
1      Agent     Smith    Matrix
In [16]: df.to_csv("/path/to/save", index=False) # if you want to save

希望这有帮助。

最新更新