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
相关产品推荐
相关产品推荐

