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

加载并标准化含播放列表的JSON文件、生成关联Pandas DataFrame失败求助

解决方案:拆平嵌套JSON并关联播放列表与歌曲数据

我完全懂你的痛点——要把这些嵌套的播放列表和歌曲数据拆成适合MySQL存储的扁平结构,同时保证每个播放列表的pid和它下面的每首歌牢牢绑定,这确实是处理这类JSON数据的关键。

你之前的代码只展开了playlists层级,但tracks还是嵌套的列表列,咱们需要换个思路:把每首歌作为一条记录,同时把对应的播放列表信息(包括pid)作为附加字段带进来。用pd.json_normalize就能做到,关键是正确搭配record_path和meta参数。

步骤1:正确拆平JSON数据

下面是可以直接运行的代码,它会把每首歌单独成一行,同时保留所属播放列表的所有信息:

import json
import pandas as pd
from sqlalchemy import create_engine

# 读取JSON文件
with open(new_file, 'r') as f:
    data = json.load(f)

# 核心:拆平tracks,同时关联播放列表的元数据
df = pd.json_normalize(
    data['playlists'],
    record_path='tracks',  # 指定要展开的嵌套列表是tracks
    # 把播放列表的所有字段作为元数据附加到每一行歌曲记录中
    meta=['pid', 'name', 'collaborative', 'modified_at', 'num_tracks', 'num_albums', 'num_followers']
)

# 可选:把时间戳转成MySQL友好的datetime格式(如果需要的话)
df['modified_at'] = pd.to_datetime(df['modified_at'], unit='s')

运行后你会得到一个扁平的DataFrame,每一行是一首歌,同时包含pid、播放列表名称等所有关联信息,完全满足你“pid与对应歌曲数据不分离”的要求。

步骤2:批量导出到MySQL

因为你有大量这类JSON文件,咱们可以把处理逻辑封装成函数,然后遍历文件批量处理入库:

def process_json_to_mysql(json_file, engine, table_name='playlist_tracks'):
    with open(json_file, 'r') as f:
        data = json.load(f)
    
    df = pd.json_normalize(
        data['playlists'],
        record_path='tracks',
        meta=['pid', 'name', 'collaborative', 'modified_at', 'num_tracks', 'num_albums', 'num_followers']
    )
    df['modified_at'] = pd.to_datetime(df['modified_at'], unit='s')
    
    # 追加写入MySQL,如果表不存在则自动创建
    df.to_sql(
        name=table_name,
        con=engine,
        if_exists='append',
        index=False,
        # 可选:指定字段类型,避免MySQL自动推断出错
        dtype={
            'pid': 'INT',
            'duration_ms': 'INT',
            'modified_at': 'DATETIME'
        }
    )

# 初始化MySQL连接引擎(替换成你的数据库信息)
engine = create_engine('mysql+pymysql://username:password@host:port/database_name')

# 遍历文件夹中的所有JSON文件(示例)
import os
json_folder = '/path/to/your/json/files'
for filename in os.listdir(json_folder):
    if filename.endswith('.json'):
        file_path = os.path.join(json_folder, filename)
        process_json_to_mysql(file_path, engine)

为什么之前的方法没生效?

你之前只指定了record_path='playlists',这只会把每个播放列表作为一行记录,而tracks会被保留成嵌套的列表列。咱们需要把record_path指向最底层的tracks,同时用meta参数把上层的播放列表信息“拉下来”,这样每首歌就能和它的播放列表完美关联了。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 17:47:44