读取多个JSON文件生成pandas DataFrame时仅加载单个文件如何解决
问题原因
你代码的核心问题是循环内没有存储每个文件的解析结果,每次迭代都会直接覆盖js变量,循环结束后js仅保留了最后一个匹配文件的内容,后续生成DataFrame自然只能拿到最后一个文件的数据。
修正方案
你可以在循环内把每个文件解析生成的子DataFrame存到列表里,最后再统一拼接成完整的DataFrame,修正后代码如下:
import json import pandas as pd import os path = 'C:\\Users\\sotir\\Desktop\\machinedataset' # 存储每个文件生成的子DataFrame df_list = [] filenames = os.listdir(path) for filename in sorted(filenames): if filename.startswith("mpd.slice") and filename.endswith(".json"): fullpath = os.path.join(path, filename) # 用with上下文管理器自动处理文件关闭,更安全 with open(fullpath, 'r', encoding='utf-8') as f: js = json.load(f) # 每个文件生成子DF后加入列表 sub_df = pd.json_normalize( js['playlists'], meta=['name', 'collaborative', 'pid', 'modified_at','num_tracks', 'num_albums', 'num_followers', 'num_edits', 'duration_ms', 'num_artists'], record_path= ['tracks'], record_prefix='_' ) df_list.append(sub_df) # 拼接所有子DF为完整DF,ignore_index重置行索引避免冲突 df = pd.concat(df_list, ignore_index=True)
关键优化点说明
- 新增
df_list列表存储每个JSON文件生成的子DataFrame,避免结果被覆盖 - 改用
with上下文管理器读取文件,无需手动调用close(),避免文件句柄泄漏 - 最终用
pd.concat拼接所有子DataFrame,ignore_index=True参数会重置全局行索引,避免多个文件的索引重复冲突 - 路径拼接改用
os.path.join,跨平台兼容性更好
内容的提问来源于stack exchange,提问作者manduk
相关产品推荐
相关产品推荐

