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()来保存文件。- 如果文件已经写成
['演员甲', '演员乙']这样的内容,再按'; '拆分无法还原原列表。应从未损坏的数据来源重新读取,或单独解析已有文件。
备注:内容仅供参考。
