You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:46:31