首页 > 数据库 >用pandas导入含嵌套字典的json文件至mysql数据库

用pandas导入含嵌套字典的json文件至mysql数据库

时间:2024-12-24 16:20:15浏览次数:14  
标签:json dict key mysql zt path data pandas

需要导入的文件格式如下,要把data-diff数组里的所有元素导进去,对于某些json文件还需要添加日期字段。

{ 
    "rc": 0,
	"rt": 6,
	"data":{
	"total": 197,
	"diff": [
		{
			"f1": 1,
			"f2": 295.5,
			"f3":{ "f4":12, "f5":13},
			 ...
		},
		{	"f1": 2,
			"f2": 39.5,
			"f3":{ "f4":10, "f5":15},
			...
		},
		...
	}
}

对于上面的文件,最终导入的效果:

select * from tableLoaded;

f1 f2 f4 f5
1 295.5 12 13
2 39.5 10 15

主代码:

import json
import os
import pandas as pd


def load_json(json_file,key_path):
    '''
    :param json_file: json文件的绝对路径,文件名必须是类型_YYYYMMDD.json的格式,如 D:\\xx\\00复盘\\data\\dbRank\\dbRank_20241224.json
    :param key_path: 需要导入的数组的路径['result','data']
    :return: 
    '''
    table_name = json_file.split('\\')[-2] # 文件夹名称即是要导入的表名称
    with open(json_file,'r',encoding='UTF-8') as f:
        data = json.load(f)
        if len(key_path) > 1: # 如果参数有给键的路径
            for path in key_path: # 遍历到最后一层
                data = data[path]
        if(table_name == 'xxx' ): # 如果是要添加日期字段的数据
            zt_date = get_ztdate_from_path(json_file) # 从文件名获取日期
            data = flatten_dict_arr(data,zt_date) # 给数组所有元素加上日期字段
        df = pd.DataFrame(data) # 把处理后的数组构建成dataFrame
    df.to_sql(table_name, con=engine, if_exists='append', index=False)

def get_ztdate_from_path(path):
    '''
    :param path: json文件的绝对路径,文件名必须是类型_YYYYMMDD.json的格式,如 D:\\xx\\00复盘\\data\\dbRank\\dbRank_20241224.json
    :return: 日期,如20241224
    '''
    return path.split('\\')[-1].split('.')[0][-8:]

def flatten_dict_arr(arr,zt_date=False):
    res = []
    for item in arr:
        if zt_date:
            item['zt_date'] = zt_date
        res.append(flatten_dict(item))
    return res

def flatten_dict(nested_dict):
    """
    将嵌套字典平铺为单层字典。
    参数:
    nested_dict -- 要平铺的嵌套字典
    返回:
    平铺后的字典
    """
    items = []
    for key, value in nested_dict.items():
        if isinstance(value, dict):
            items.extend(flatten_dict(value).items())
        else:
            items.append((key, value))
    return dict(items)

标签:json,dict,key,mysql,zt,path,data,pandas
From: https://www.cnblogs.com/stxz/p/18628003

相关文章