如何用Python循环批量合并目录JSON为CSV并解决Trailing data报错
批量JSON转CSV合并方案
原代码问题排查
你的代码存在3个核心问题,是导致报错和无法正常合并的原因:
- 路径拼接错误:
os.listdir(dir1)仅返回目标目录下的文件名,不包含父目录路径,直接执行open(ffile)会在当前脚本运行的工作目录下找文件,根本读不到jsfiles文件夹内的JSON文件,极易触发文件读取错误。 - 合并逻辑缺失:循环内每次都直接给
df变量重新赋值,之前读取的文件内容会被完全覆盖,最终只会保留最后一个读取的文件内容,完全没实现多文件合并的需求。 - JSON格式适配错误:抛出
ValueError: Trailing data是因为你存储的JSON文件大概率是JSON Lines格式(即每行独立存储一个JSON对象,是批量数据导出、日志存储的常用格式),pandas.read_json()默认读取整文件为单个标准JSON结构,无法识别逐行存储的格式,需要加参数适配。
可直接运行的修正代码
import pandas as pd import os # 配置参数 json_file_dir = 'jsfiles' output_csv_path = 'merged.csv' # 初始化列表暂存所有文件读取结果 all_df = [] for filename in os.listdir(json_file_dir): # 跳过非json后缀的文件,避免误读目录内其他文件 if not filename.endswith('.json'): continue # 拼接文件完整路径,兼容Windows/macOS/Linux系统 full_path = os.path.join(json_file_dir, filename) # 读取JSON,lines=True适配JSON Lines格式,解决Trailing data报错 single_df = pd.read_json(full_path, encoding='utf-8', lines=True) all_df.append(single_df) # 合并所有数据并导出 final_df = pd.concat(all_df, ignore_index=True) final_df.to_csv(output_csv_path, encoding='utf-8', index=False) print(f"处理完成:共合并{len(all_df)}个JSON文件,结果已导出至{output_csv_path}")
补充说明
- 如果目录内同时存在标准整文件JSON、JSON Lines两种格式,可以把读取文件的代码加异常捕获,两种格式自动兼容:
try: single_df = pd.read_json(full_path, encoding='utf-8') except ValueError: single_df = pd.read_json(full_path, encoding='utf-8', lines=True) - 如果JSON数据存在多层嵌套结构,需要先做扁平化处理再导出,否则嵌套字段会被直接转成字符串存入CSV,不利于后续分析。
- 如果文件总数据量过大超过内存,可以改用逐行读取、逐行写入CSV的方式,避免内存溢出。
内容的提问来源于stack exchange,提问作者Kasi
相关产品推荐
相关产品推荐

