Python csv.DictWriter写入含列表字段字典生成目标CSV的方法
问题原因
Python自带的csv.DictWriter写入时会直接将字段值转为字符串存入单元格,你字典中add、reg字段的值是列表类型,直接写入就会把带方括号的完整列表字符串塞进单个单元格,无法得到列表元素逐行拆分、日期时间字段跨行重复的目标效果。
修正方案
写入前先对原始数据做扁平化处理:遍历每条记录中add、reg列表的对应索引,将同一索引位置的add值、reg值和该条记录的日期、时间组合成新的单行记录,所有记录拆分完成后再统一写入CSV即可。
修正后的可直接运行代码如下:
import csv # 原始数据 d = [{'local_date': '12/16/2022', 'local_time': '12:00', 'add':[2, 8, 22, 17], 'reg':[1001, 1002, 1003, 1004] }] fields = ['local_date', 'local_time', 'add', 'reg'] # 拆分含列表的嵌套记录为单行结构 flattened_rows = [] for item in d: # 按两个列表的最短长度遍历,避免长度不匹配时索引报错 for add_val, reg_val in zip(item['add'], item['reg']): flattened_rows.append({ 'local_date': item['local_date'], 'local_time': item['local_time'], 'add': add_val, 'reg': reg_val }) # 写入CSV with open("tester.csv", "w", newline='', encoding='utf-8') as outfile: writer = csv.DictWriter(outfile, fieldnames=fields) writer.writeheader() writer.writerows(flattened_rows)
注意事项
- 打开CSV文件时传入
newline=''是Python官方csv模块推荐的标准写法,可以避免不同系统下写入出现多余空行的问题 - 代码中用
zip()配对两个列表的元素,会自动以较短的列表长度为准完成遍历,如果需要强制要求两个列表长度一致,可以在遍历前加长度校验逻辑抛出提示
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

