如何合并多子目录中JSON格式txt数据生成pandas DataFrame
多子目录JSON数据合并为Pandas DataFrame实现方案
现有代码存在的问题
- 缺少必要依赖导入:未导入
pandas、json库,运行会直接报错 - 已弃用API:
DataFrame.append()方法在pandas 2.0+版本已被移除,运行会触发报错 - 性能较差:循环中反复拼接DataFrame会产生大量中间对象,数据量较大时效率极低
- 路径匹配逻辑冗余:两次遍历目录可以合并优化
优化后实现代码
单文件名全局合并版本
如果所有匹配*application_data.txt规则的文件结构一致,直接合并为一个DataFrame即可使用:
import json import pandas as pd from pathlib import Path # 定义根目录路径 root_dir = Path('/content/gdrive/MyDrive/fd249093-60d2-4d4f-99d0-3e98954f7711') # 一次性递归匹配所有符合规则的文件,无需分两次遍历 all_data = [] for file_path in root_dir.rglob('*application_data.txt'): # 可根据需求去掉该判断,保留则会跳过根目录下直接存储的匹配文件 if file_path.parent == root_dir: continue with open(file_path, 'r', encoding='utf-8') as fp: json_data = json.load(fp) all_data.extend(json_data) # 一次性生成最终DataFrame,性能远高于循环拼接 app_data = pd.DataFrame(all_data)
按文件名分组生成多DataFrame版本
如果需要保留原有代码按不同文件名分别生成独立DataFrame的逻辑,可以使用以下版本:
import json import pandas as pd from pathlib import Path from collections import defaultdict root_dir = Path('/content/gdrive/MyDrive/fd249093-60d2-4d4f-99d0-3e98954f7711') data_by_filename = defaultdict(list) for file_path in root_dir.rglob('*application_data.txt'): if file_path.parent == root_dir: continue file_name = file_path.name with open(file_path, 'r', encoding='utf-8') as fp: json_data = json.load(fp) data_by_filename[file_name].extend(json_data) # 所有文件名对应的DataFrame存储在字典中,key为文件名,value为对应合并后的DataFrame df_dict = {file_name: pd.DataFrame(data) for file_name, data in data_by_filename.items()}
优化点说明
- 路径匹配更简洁:用
rglob递归遍历所有子目录,一次性拿到所有符合命名规则的文件,减少冗余循环 - 性能提升显著:用列表临时存储所有JSON数据,最后一次性生成DataFrame,避免了循环拼接的性能开销
- 兼容高版本pandas:不再使用已弃用的
append方法 - 兼容性更好:显式指定文件读取编码为
utf-8,避免部分特殊字符场景下的读取报错
内容的提问来源于stack exchange,提问作者Abhishek Kaushik
相关产品推荐
相关产品推荐

