下面给出一个通用、简洁的函数,用来把「字典列表」保存为 CSV 文件。
列表中每个字典的 key 会自动作为列名;如果不同字典的 key 不完全一致,也会自动取并集作为最终列名。
import csv
import os
from typing import List, Dict, Any, Optional
def save_dict_list_to_csv(
data: List[Dict[str, Any]],
file_path: str,
*,
delimiter: str = ',',
encoding: str = 'utf-8',
sort_columns: bool = False,
write_header: bool = True
) -> None:
"""
将字典列表保存为 CSV 文件。
参数
----
data : List[Dict[str, Any]]
待保存的字典列表。
file_path : str
目标 CSV 文件路径(可以是相对路径或绝对路径)。
delimiter : str, optional
列分隔符,默认 ','。
encoding : str, optional
文件编码,默认 'utf-8'。
sort_columns : bool, optional
是否按字母顺序对列名排序,默认 False(保持发现顺序)。
write_header : bool, optional
是否写入表头,默认 True。
返回
----
None
"""
if not data:
# 数据为空时,创建一个空文件即可
open(file_path, 'w', encoding=encoding).close()
return
# 收集所有可能的列名(按出现顺序)
all_keys: List[str] = []
seen = set()
for row in data:
for k in row.keys():
if k not in seen:
seen.add(k)
all_keys.append(k)
if sort_columns:
all_keys = sorted(all_keys)
# 确保目标目录存在
os.makedirs(os.path.dirname(file_path) or '.', exist_ok=True)
with open(file_path, 'w', newline='', encoding=encoding) as f:
writer = csv.DictWriter(f, fieldnames=all_keys, delimiter=delimiter)
if write_header:
writer.writeheader()
writer.writerows(data)
# ====== 示例用法 ======
if __name__ == '__main__':
version_items = [
{'version': '1.0.0', 'date': '2023-01-01', 'author': 'Alice'},
{'version': '1.1.0', 'date': '2023-03-15'},
{'version': '2.0.0', 'date': '2023-08-01', 'author': 'Bob', 'note': 'Major update'}
]
save_dict_list_to_csv(version_items, 'versions.csv')
运行后会在当前目录生成 versions.csv
文件,内容如下:
version,date,author,note
1.0.0,2023-01-01,Alice,
1.1.0,2023-03-15,,
2.0.0,2023-08-01,Bob,Major update