PAYATHON 2026

Python csv 如何读写包含列表字段的字典数据?

数据小许

结论

csv.DictWriter 不会自动把 Python 列表转换成读入时使用的分号分隔格式。写入时,列表会先变成普通字符串,例如 ['演员甲', '演员乙']。要保留原来的格式,写入前先用 '; '.join(...) 将列表字段转成字符串,读取后再用 split('; ') 还原。整个过程只需使用标准库 csv,无需 pandas。

写入前转换列表字段

假设 data_list 中的 Aktorzy 和 Reżyser 已经是列表,可以先复制每一行,再转换这两个字段:

import csv

list_fields = ('Aktorzy', 'Reżyser')

with open('filmy.csv', 'w', newline='', encoding='UTF-8') as output_file:
    writer = csv.DictWriter(output_file, fieldnames=data_list[0].keys())
    writer.writeheader()

    for row in data_list:
        csv_row = row.copy()
        for field in list_fields:
            value = csv_row.get(field)
            if isinstance(value, list):
                csv_row[field] = '; '.join(value)
        writer.writerow(csv_row)

例如,列表 ['演员甲', '演员乙'] 在传给 DictWriter 前会变成 演员甲; 演员乙。字段中的逗号和引号等 CSV 格式由 csv 模块处理。

读取时还原列表

重新读取文件时,用相同的分隔符拆分这两个字段。先检查字段是否为空,避免空字段变成 ['']:

with open('filmy.csv', mode='r', encoding='UTF-8', newline='') as file:
    reader = csv.DictReader(file)
    data_list = list(reader)

for row in data_list:
    for field in list_fields:
        value = row.get(field, '')
        row[field] = value.split('; ') if value else []

这样,读入 data_list 后,演员和导演字段会是列表;写入 CSV 时,再将它们转换成分号分隔的字符串。

注意事项

  • 代码直接把列表交给 DictWriter 时,输出会带有列表的方括号、引号等 Python 字符串表示。写入前应先将列表转换成分号分隔的字符串。
  • '; '.join(value) 要求列表元素都是字符串。如果列表中可能有非字符串值,应先确定需要的格式,再转换元素。
  • 列表元素不能包含 '; ',否则简单的 split 无法可靠还原。遇到这种情况,可以改用 JSON 等明确的序列化格式存储该字段。
  • with open(...) 会在代码块结束时关闭文件,无需再调用 file.close()。写入时也不必在 with 块后调用 app.quit() 来保存文件。
  • 如果文件已经写成 ['演员甲', '演员乙'] 这样的内容,再按 '; ' 拆分无法还原原列表。应从未损坏的数据来源重新读取,或单独解析已有文件。

备注:内容仅供参考。