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

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

时间:2024-12-24 16:20:15浏览次数:4  
标签: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

相关文章

  • 基于 Spring Boot、MyBatis Plus、MySQL、HTML、CSS、JavaScript、Vue.js、Redis 与 S
    1.项目概述1.1项目目标为学生提供个性化课程推荐,助力高效选课。构建师生交流社区,促进课程相关交流。实现课程与用户信息的高效管理。1.2功能概述用户管理:包括注册、登录、信息修改、角色管理。课程管理:课程发布、查询、修改、删除、选课操作、评价与推荐。交流社区:课......
  • SQLMAP注入之MySQL注入总结
    SQLMAP注入之MySQL注入总结简介sqlmap是一个开源的自动化SQL注入(SQLi)攻击和数据库接管工具,广泛应用于渗透测试、漏洞评估和安全研究。它旨在帮助安全研究人员和渗透测试人员发现和利用SQL注入漏洞,进行数据库接管、信息泄露和数据提取等操作。sqlmap提供了强大的功能,可以......
  • 免费送源码:Java+SpringBoot+MySQL SpringBoot会务管理系统 计算机毕业设计原创定制
    SpringBoot会务管理系统摘 要随着计算机技术的发展,特别是计算机网络技术与数据库技术的发展,使用人们的生活与工作方式发生了很大的改观。本课题研究的会务管理系统,主要功能模块包括用户管理,会议信息,会议签到,请假管理,评分记录,听会感受,意见箱等,采取面对对象的开发模式进行......
  • mysql之多表查询
    一、多表关系   概述:在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务直接相互关联,所以各个表结构之间也存在着各种关系,基本上分为三种:        一对多(多对一)        多对多       ......
  • Java 实战项目:Spring Boot + MyBatis Plus + MySQL + Shiro + Thymeleaf 赋能仓库管理
    1.项目概述本仓库管理系统旨在实现对仓库中商品、供应商、客户、员工、权限、日志等信息的有效管理,提升仓库运营效率和管理水平。系统主要功能包括基础数据管理、进货管理、销售管理、库存管理、系统管理等。2.系统架构2.1技术选型后端:SpringBoot+MyBatisPlus+MySQL......
  • elasticsearch修改Ik分词器源码实现基于MySQL更新分词
    本文主要记录如何修改Ik分词器源码来实现基于MySQL数据库更新分词,所有步骤均为本人实际操作验证。如果你也刚好刷到这篇文章,希望对你有所帮助。使用过Ik分词器的应该都知道,它提供了三种配置热词词库的方式:Ik内置词库Ik外置静态词库Ik远程词库具体可以去看Ik的配置文件,这里不......
  • mysql 分区总结
    初稿摘录,后续会按自己经验更新:https://blog.csdn.net/weixin_42507868/article/details/113294679四种常见的分区类型: RANGE分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段。LIST分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表......
  • Java 项目实战:全方位解析基于 Spring Boot、MySQL、FastJSON、MyBatis - Plus、Swagge
    1.引言1.1编写目的本设计文档详细阐述了SNS系统的架构、功能模块、数据结构、接口设计以及系统部署等方面,为系统的开发、测试、维护提供全面的指导,确保项目团队成员对系统有清晰一致的理解,保证系统的顺利实施与迭代优化。1.2适用范围本设计文档适用于SNS系统的开发团队、测试......
  • MySQL主从复制中启用GTID(全局事务标识符)模式
    在MySQL中启用GTID(全局事务标识符)模式进行主从复制涉及几个步骤。GTID为每个事务赋予一个唯一的标识符,从而简化了复制过程和故障恢复。以下是启用GTID模式的基本步骤:首先确保两台数据库目前数据保持一致1.准备工作确保您使用的MySQL版本支持GTID。GTID从MySQL5.6版本开始支持......
  • Can't connect to local MySQL server through socket
    mysql-urootERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)这是mysql登录时找不到套接字的问题。首先需要明白的是,Linux端的mysqlserver启动时会开启一个socket,Linux上的MySQL的客户端在不使用IP连接时mysqlserver时,默认......