Python3用简单的方法,将一组具有相同格式的json数据(将多层json展开到一层),整理到excel中

本文介绍如何将嵌套的JSON数据转换为单层结构,并利用Python的pandas库将其导出到Excel文件中,便于数据分析。
部署运行你感兴趣的模型镜像

在日常使用抓取数据的过程中,回传的数据是json格式的。
当抓取到几百条数据后,想要快速的掌握这些数据的特征,比较好的方法就是直接导出到excel,直观的去看。

下面介绍一下,如何简单的通过python,将json数据整理到excel。
(写完发现大部分篇幅都用于介绍如何解除json嵌套关系了,实际转换并导出excel的部分,连同导入模块在内只用了3行代码,想看这个的可以直接拖动到本文最下方查看)
一组具有相同格式的json数据
转换成Excel

1、首先解除json的嵌套关系

假设一组具有相同格式的json数据,保存在列表json_arr中。
列表中的每条json数据格式如下:

{
	'code': 200,
	'msg': 'ok',
	'data': {
		'logId': '5a8795xxxxxxxxxxxxxxxxc15631',
		'errorClass': 1,
		'appKey': '527xxxxxxxxxxxxd000067',
		'appVersion': 'xxx',
		'channel': 'baidu',
		'deviceType': 'vivo X9s',
		'deviceVersion': None,
		'arch': 'AArch64 Processor rev 0 (aarch64)',
		'appPackageName': 'xxx.xxx.android',
		'os': 'android',
		'osVersion': '8.1.0',
		'jailbroken': 'false',
		'disk': -1.0,
		'sddisk': -1.0,
		'mem': -1.0,
		'cpu': None,
		'battery': -1.0,
		'temp': -1.0,
		'clientTime': '2019-07-17 13:59:07',
		'serverTime': '2019-07-17 14:14:43',
		'stackMd5': '7663999xxxxxxxxxxxxxd0a14',
		'umid': None
	},
	'timestamp': 1563348228240,
	'traceId': '4822xxxxxxxxxxxxxxd54'
}

这种嵌套关系,在python中,也可以看做是,字典里面嵌套了字典。
为了后续的Excel导出,首先需要解除这种嵌套关系。

【方法1】直接将嵌套的json提取出来

比如,如果你需要的只是data部分,
那么通过列表表达式,将data部分提取出来就行了。

data_json_arr = [j['data'] for j in json_arr]
【方法2】只将有用的键值对提取出来

加载jsonpath模块,如果没有可以通过pip install jsonpath安装。
使用jsonpath.jsonpath(json,'$..key')[0],不管json有多少层,只要输入键值都能取到。
返回值是列表,所以用[0]取出列表中的值。
(注意:上述是假设json嵌套中所有键名称不重复;如果重复,jsonpath返回的列表可能不止一个值,注意自行调整优化)

from jsonpath import jsonpath as jp
keys = ['msg','appKey','deviceType']
data_json_arr = [{k:jp(j,'$..'+k)[0] for k in keys} for j in json_arr ]
【方法3】将json全部展开成一层

没找到现成的模块,所以自己写了个展开方法

def SingleLayerJson(j):
    """ 多层json展开变成一层(如果包含列表项会为其标记序号)
        例如:
        {'a':1,
        'b':{'x':11,
            'y':12},
        'c':2}
        变成
        {'a':1,
        'b_x':11,
        'b_y':12,
        'c':2}
    """
    Nest = True
    while Nest:
        Nest = False
        for k in list(j.keys()):
            if isinstance(j[k], dict):
                for kk in list(j[k].keys()): # 逐级用下划线拼接key
                    j[k + '_' + kk] = j[k][kk]
                del j[k]
                Nest = True
            elif isinstance(j[k], list): # 遇到列表项用下划线拼接index
                for i,v in enumerate(j[k]):
                    j[k + '_' + str(i)] = v
                del j[k]
                Nest = True
    return j

不论多复杂结构的json,直接用该方法直接展开成一层就完事了。

data_json_arr = [SingleLayerJson(j) for j in json_arr] 
最终得到没有嵌套关系的json数据列表

data_json_arr列表中包含的每条json数据,都变成单层json,不存在嵌套

{
	'code': 200,
	'msg': 'ok',
	'timestamp': 1563348228240,
	'traceId': '4822xxxxxxxxxxxxxxd54',
	'data_logId': '5a8795xxxxxxxxxxxxxxxxc15631',
	'data_errorClass': 1,
	'data_appKey': '527xxxxxxxxxxxxd000067',
	'data_appVersion': 'xxx',
	'data_channel': 'baidu',
	'data_deviceType': 'vivo X9s',
	'data_deviceVersion': None,
	'data_arch': 'AArch64 Processor rev 0 (aarch64)',
	'data_appPackageName': 'xxx.xxx.android',
	'data_os': 'android',
	'data_osVersion': '8.1.0',
	'data_jailbroken': 'false',
	'data_disk': -1.0,
	'data_sddisk': -1.0,
	'data_mem': -1.0,
	'data_cpu': None,
	'data_battery': -1.0,
	'data_temp': -1.0,
	'data_clientTime': '2019-07-17 13:59:07',
	'data_serverTime': '2019-07-17 14:14:43',
	'data_stackMd5': '7663999xxxxxxxxxxxxxd0a14',
	'data_umid': None
}

2、将表项为json串的列表转换为EXCEL表格

这一步就很简单了,单层json组成的列表,可以直接转换为dataframe,然后输出为excel就行了

import pandas as pd
df = pd.DataFrame(data_json_arr)
df.to_excel("output.xlsx")

这样数据就输出到了excel中。

当然熟悉DataFrame操作的,
也可以直接通过操作DataFrame,剔除无用列、排序等,
或者将DataFrame转换成多维列表矩阵,进行其他数据处理操作。

df = df.iloc[:, 0:-1]              # 剔除最后一列
nd_arr = np.array(df)              # 转换为np.ndarray()
final_list = nd_arr.tolist()       # 转换为list

到这里就结束了

所实现的就是:
将具有相同格式的,不包含子嵌套的,一组json列表:

[
	{'code':200, 'msg':'ok', 'timestamp': 1563348228240,},
	{'code':200, 'msg':'ok', 'timestamp': 1563348229050,},
	{'code':200, 'msg':'ok', 'timestamp': 1563348236780,},
	{'code':200, 'msg':'ok', 'timestamp': 1563348245670,},]

转换成excel输出。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>好的,我现在需要帮助用户解决如何使用Python生成包含大量多层嵌套的字典和列表的JSON数据结构,并且数据量很大。用户的目标是构建一个拥有上千个元素的大规模JSON对象。首先,我应该回忆一下Python中处理JSON方法,以及如何高效地生成这样的数据结构。 首先,用户提到了参考的引用内容,其中提到Python中的字典和列表与JSON结构的相似性,以及如何处理JSON数据。根据引用[1]和[2],使用Python处理JSON非常方便,因为字典和列表可以直接转换为JSON对象和数组。所以,我需要指导用户如何构建这些结构。 接下来,用户需要生成一个包含多层嵌套的大规模JSON。可能需要从基础结构开始,逐步添加层次。例如,顶层可能是一个字典,里面包含多个列表,每个列表里又有字典,层层嵌套。例如,公司结构、用户数据等,可能适合作为多层嵌套的例子。 然后,考虑到数据量大的问题,手动逐个添加元素显然不现实。所以需要使用循环和随机生成数据方法。例如,使用循环生成1000个用户,每个用户有不同的属性,可能还有子列表,比如订单、朋友列表等,这样就能形成多层嵌套的结构。 另外,用户可能需要考虑内存的问题。生成上千个元素的数据结构可能会占用较多内存,因此需要注意生成方式是否高效。例如,使用生成器或者逐步构建结构,而不是一次性在内存中创建所有对象。不过,对于JSON导出,通常需要一次性构建整个结构,所以可能需要优化数据结构,避免不必要的重复或冗余。 接下来,我需要考虑如何组织代码。首先导入json模块,然后创建一个顶层字典,里面包含列表,每个列表元素又是一个字典,可能包含更多的列表和字典。例如,创建一个包含多个部门的公司数据,每个部门有多个员工,每个员工有多个项目,每个项目有多个任务,等等。这样就能形成多层嵌套。 然后,使用循环来生成这些数据。例如,外层循环生成部门,内层循环生成员工,每个员工再生成项目列表,每个项目生成任务列表。这样通过嵌套循环可以构建出多层结构。同时,使用随机函数(如random库)来生成不同的名称、ID等,以增加数据的多样性。 在生成数据时,需要注意数据类型的正确性,例如,字符串、整数、布尔值等,确保最终结构可以正确转换为JSON。此外,还要处理可能存在的特殊字符,确保JSON格式正确。 然后,导出为JSON文件时,使用json.dump()方法,并设置indent参数使输出的JSON格式化,便于阅读。同时,如果数据量特别大,可能需要考虑不使用indent以减少文件大小,但用户提到数据量较大,可能更关注可读性,所以保留indent可能是合适的。 此外,性能优化也是一个考虑点。生成上千个元素可能会比较慢,尤其是在深层嵌套的情况下。可以考虑使用列表推导式或生成器表达式来提高效率,或者分块生成数据。不过,对于用户的需求来说,可能不需要过于复杂的优化,只要能正确生成数据即可。 最后,还需要考虑数据的去重问题,如引用[3]提到的json_dedupe函数,但用户的问题主要是生成数据,而不是去重。不过,可以提醒用户在生成数据时注意避免重复,或者在生成后使用去重方法。 总结一下,步骤应该是: 1. 设计数据结构,确定嵌套层次。 2. 使用循环和随机数据生成大规模嵌套数据3. 导出为JSON文件,处理格式和性能问题。 4. 提供示例代码,并解释各部分的作用。 5. 给出优化建议,如分块生成、使用生成器、调整缩进等。 现在,需要检查是否有遗漏的点,例如如何处理特殊数据类型(如日期时间),但用户没有提到,可能不需要处理。另外,确保代码示例正确,没有语法错误,并符合用户的引用要求。</think>为了在Python中生成多层嵌套的大规模JSON数据,可以按照以下步骤操作: ### 一、基础结构构建 1. 使用嵌套字典和列表组合: ```python import json import random from uuid import uuid4 # 生成多层嵌套数据示例 def generate_deep_nested_data(num_elements=1000): data = {"system": {"users": [], "devices": []}} for i in range(num_elements): user = { "id": str(uuid4()), "profile": { "name": f"user_{i}", "roles": ["admin" if i%5==0 else "user"], "permissions": [ {"level": random.randint(1,5), "scope": ["read", "write"]} ] }, "connections": [ { "type": "friend" if j%3==0 else "colleague", "history": [{"date": "2023-01-01", "interaction": k} for k in range(3)] } for j in range(2) ] } data["system"]["users"].append(user) return data ``` ### 二、数据生成优化技巧 1. **分块生成**:每生成500个元素执行一次内存回收 2. **使用生成器表达式**: ```python (data["system"]["users"].append(user) for user in user_generator()) ``` ### 三、JSON导出与验证 ```python # 导出JSON文件 with open(&#39;large_data.json&#39;, &#39;w&#39;) as f: json.dump(data, f, indent=2) # 保留缩进增强可读性 # 验证数据结构 print(f"总用户数:{len(data[&#39;system&#39;][&#39;users&#39;])}") print(f"嵌套层级示例:{data[&#39;system&#39;][&#39;users&#39;][0][&#39;connections&#39;][0][&#39;history&#39;][0]}") ``` ### 四、性能优化建议 1. 使用`ujson`替代标准库提升3倍序列化速度 2. 设置`indent=None`可减少30%文件体积 3. 增加类型验证层确保数据合规性
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值