Python从JSON文件提取指定字段导出至CSV的问题
解决方案
你的代码存在几个核心问题导致输出不符合预期:
- 错误使用
emp.keys()生成表头,而你需要的是formattedName和actualStartDate两个自定义表头 - 仅在第一个员工循环时写入表头,但后续只输出了最后一个员工的数据,没有遍历所有员工
- 未正确嵌套提取目标字段(
formattedName和actualStartDate都位于多层嵌套结构中) - 用追加模式打开CSV会导致多文件处理时重复写入表头
以下是修正后的代码:
import os import csv import json def csvDump(): output_file = 'AnniversaryOutput.csv' # 检查输出文件是否存在,决定是否写入表头 write_header = not os.path.exists(output_file) for filename in os.listdir('./Anniversaries/'): print(filename) # 安全拼接文件路径,提升跨平台兼容性 file_path = os.path.join('./Anniversaries/', filename) with open(file_path, 'r') as json_file: data = json.load(json_file) employee_data = data['workers'] with open(output_file, 'a', newline='') as f: csv_writer = csv.writer(f) # 仅在文件首次创建时写入表头 if write_header: csv_writer.writerow(['formattedName', 'actualStartDate']) write_header = False # 遍历每个员工,提取目标字段 for emp in employee_data: # 安全提取嵌套字段,避免键缺失报错 formatted_name = emp.get('person', {}).get('legalName', {}).get('formattedName', '') # 处理workAssignments为数组的情况,默认取第一个分配的日期 actual_start_date = emp.get('workAssignments', [{}])[0].get('actualStartDate', '') # 写入当前员工的两行数据 csv_writer.writerow([formatted_name, actual_start_date]) return
关键改进说明
- 表头控制:通过检查文件是否存在,确保表头仅写入一次,避免多文件处理时重复输出表头
- 安全字段提取:使用
dict.get()方法逐层提取嵌套字段,同时设置默认空值,避免因数据结构缺失导致程序崩溃 - 完整遍历逻辑:对每个员工执行字段提取和写入操作,确保所有员工数据都被导出
- 路径优化:用
os.path.join()拼接文件路径,解决不同操作系统的路径格式问题 - 资源自动管理:保留
with语句自动处理文件打开/关闭,移除冗余的f.close()调用
内容的提问来源于stack exchange,提问作者Pogo947
相关产品推荐
相关产品推荐

