如何用Python从不规则/不一致的字典列表生成CSV文件?
处理不规则字典列表生成统一CSV的方案
需求:有一组键不统一的字典列表,需要生成包含所有字典数据的CSV文件,遍历过程中遇到新键就创建对应的新列。
示例
输入字典列表:
input = [{"name": "John"}, {"name": "Bob", "age":"55"}, {"age": "43"}, {"name": "Phil", "age": "60", "job": "Builder"}]
预期输出CSV(表格形式):
| name | age | job |
|---|---|---|
| John | ||
| Bob | 55 | |
| 43 | ||
| Phil | 60 | Builder |
现有尝试代码
提取所有列名(fieldnames)
def extract_fields(raw_data): fields = [] for i in raw_data: for j in i.keys(): if j not in fields: fields.append(j) return fields
写入CSV文件
def export_csv(input, fields): with open('mycsvfile.csv', 'w') as f: w = csv.DictWriter(f, fields) w.writeheader() w.writerows(input)
疑问:不确定writerows函数能否将字典键值正确映射到对应列。
解答
你的思路完全可行,csv.DictWriter的writerows方法可以自动匹配键与列名:
- 每个字典中的键会对应到fieldnames里的列,值会写入对应单元格;
- 如果某个字典缺少fieldnames中的键,该列对应的单元格会自动留空,完全符合需求。
优化建议
可以优化extract_fields函数,用更高效的方式去重并可选保留键的首次出现顺序:
def extract_fields(raw_data): # 保留键首次出现的顺序(Python3.7+适用,利用字典有序特性) fields = {} for item in raw_data: fields.update({key: None for key in item.keys()}) return list(fields.keys())
如果不需要顺序,用集合去重效率更高:
def extract_fields(raw_data): fields = set() for item in raw_data: fields.update(item.keys()) return list(fields)
完整可运行代码
import csv def extract_fields(raw_data): fields = {} for item in raw_data: fields.update({key: None for key in item.keys()}) return list(fields.keys()) def export_csv(input_data, fields): # 添加newline=''避免CSV空行,指定utf-8编码兼容特殊字符 with open('mycsvfile.csv', 'w', newline='', encoding='utf-8') as f: w = csv.DictWriter(f, fields) w.writeheader() w.writerows(input_data) # 测试调用 input_data = [{"name": "John"}, {"name": "Bob", "age":"55"}, {"age": "43"}, {"name": "Phil", "age": "60", "job": "Builder"}] all_fields = extract_fields(input_data) export_csv(input_data, all_fields)
内容的提问来源于stack exchange,提问作者vile_goat
相关产品推荐
相关产品推荐

