加载并标准化含播放列表的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
相关产品推荐
相关产品推荐

