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

Python实现批量将指定路径多个JSON文件分别转换为CSV文件

批量JSON转CSV实现方案

实现逻辑

  • 遍历指定JSON目录下所有.json格式文件,自动跳过非目标文件
  • 按文件名命名规则拆分字符串,提取traceJSON-后的首段数字,作为type=2数据条目的sender字段值
  • 完全复用原有单文件转换的字段格式化规则:所有数值字段保留2位小数,CSV表头保持和原逻辑一致
  • 自动管理文件读写资源,避免手动关闭文件的遗漏问题
  • 输出CSV和原JSON同名,统一存到指定的输出目录,目录不存在则自动创建

完整实现代码

import os
import json
import csv

# 配置路径
JSON_DIR = '/Users/hh/MyDataSet/'
CSV_OUTPUT_DIR = '/Users/hh/MyDataSet/GTruth/'

# 不存在输出目录则自动创建
os.makedirs(CSV_OUTPUT_DIR, exist_ok=True)

# 遍历目录下所有文件
for filename in os.listdir(JSON_DIR):
    # 筛选json文件
    if not filename.endswith('.json'):
        continue
    # 提取文件名首段数字:按-分割后第二段即为首段数字
    file_base_name = filename.removesuffix('.json')
    name_parts = file_base_name.split('-')
    # 校验文件名格式是否符合要求,不符合则跳过
    if len(name_parts) < 6 or name_parts[0] != 'traceJSON':
        print(f"跳过格式不符合的文件: {filename}")
        continue
    type2_sender = name_parts[1]
    
    # 读取json数据
    data = []
    json_path = os.path.join(JSON_DIR, filename)
    with open(json_path, 'r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            if line: # 跳过空行
                data.append(json.loads(line))
    
    # 写入对应csv
    csv_path = os.path.join(CSV_OUTPUT_DIR, f"{file_base_name}.csv")
    with open(csv_path, 'w', encoding='utf-8', newline='') as csv_file:
        writer = csv.writer(csv_file)
        # 写入表头
        writer.writerow(["row number","type","rcvTime","sender","pos_x","pos_y","pos_z","spd_x","spd_y","spd_z","acl_x","acl_y","acl_z"
                        ,"hed_x","hed_y","hed_z"])
        for elem_idx, elem in enumerate(data):
            # 拼接行数据
            base_row = [
                elem_idx,
                elem['type'],
                round(elem['rcvTime'], 2),
                # sender字段按type动态取值
                type2_sender if elem['type'] == 2 else round(elem['sender'], 2),
                round(elem['pos'][0], 2),
                round(elem['pos'][1], 2),
                round(elem['pos'][2], 2),
                round(elem['spd'][0], 2),
                round(elem['spd'][1], 2),
                round(elem['spd'][2], 2),
                round(elem['acl'][0], 2),
                round(elem['acl'][1], 2),
                round(elem['acl'][2], 2),
                round(elem['hed'][0], 2),
                round(elem['hed'][1], 2),
                round(elem['hed'][2], 2)
            ]
            writer.writerow(base_row)
    print(f"文件处理完成: {filename} -> {file_base_name}.csv")

print("所有文件转换完成!")

补充说明

  • 代码新增了文件名格式校验,不符合命名规则的文件会自动跳过并提示,避免运行报错
  • 统一添加utf-8编码配置,避免不同系统下打开文件的乱码问题
  • 写CSV时加了newline=''参数,避免Windows系统下生成的CSV出现多余空行
  • 用enumerate替代原有的range(len(data))写法,遍历逻辑更简洁,转换效果和原单文件代码完全一致

内容的提问来源于stack exchange,提问作者ttina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:31:41