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

读取多个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:06:09