dict_list_to_csv

下面给出一个通用、简洁的函数,用来把「字典列表」保存为 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值