用python实现多嵌套json数据存入excel表格——以美食数据为例

json嵌套格式如下:

主要为
[区位[商家{菜单}],区位[商家{菜单}],…,区位[商家{菜单}]}的数据格式

{
	"id": 13779,
	"code": "xa",
	"pinyin": "xian",
	"addr": "西安",
	"areaId": 113,
	"areaName": "碑林区",
	"level": 2,
	"parentId": 2131,
	"eshopList": [
		{
			"id": 2106,
			"addrId": 5897,
			"shopId": "E9347828247610564279",
			"name": "极速披萨外卖",
			"brand": null,
			"recentOrderNum": 1335,
			"imagePath": "078a1ff5a967e578bee6614d93adf9fajpeg",
			"rating": "4.7",
			"ratingCount": "376",
			"address": "西安市碑林区东关南街29号2号楼101室",
			"phone": "13759967293 13619256197",
			"latitude": "34.25375",
			"longitude": "108.97534",
			"description": null,
			"areaName": "碑林区",
			"city": null,
			"limitNum": null,
			"menuList": [省略,其中包含多个字典]
			"eaddr": null
		},
		{
			"id": 5450,
			"addrId": 5906,
			"shopId": "E8089558816195246680",
			"name": "麻辣诱惑小龙虾(南稍门店)",
			"brand": null,
			"recentOrderNum": 893,
			"imagePath": "7b257dc4ca9f48179834f09de8400c0djpeg",
			"rating": "4
<think>我们面对的任务是将嵌套JSON数据转换为Excel表格。根据用户提供的引用,我们可以参考几种不同的方法。用户的需求是处理嵌套JSON,并且导出到Excel。根据引用[1]、[2]、[3],我们可以总结出几种方法: 1. 使用pandas的json_normalize函数(如引用[1]所示)。这种方法适合处理嵌套JSON,特别是当JSON结构中有列表嵌套时,可以指定record_path来展开。 2. 使用tablib库(如引用[2]所示)。这种方法需要手动构建表头和数据行,适合对数据结构有明确了解的情况。 3. 使用xlwt库(如引用[3]所示)。这种方法需要层循环遍历JSON数据,并逐行写入Excel,适用于嵌套且需要自定义写入格式的情况。 考虑到用户的需求是处理嵌套JSON,我们首先推荐使用pandas,因为它简单且强大,能够处理大嵌套情况。但如果嵌套非常复杂(嵌套),可能需要结合递归或次展开。 下面,我们将分步骤说明如何使用pandas来处理嵌套JSON并导出到Excel。 ### 步骤1: 导入必要的库 ```python import pandas as pd import json ``` ### 步骤2: 加载JSON数据 假设JSON数据来自一个文件,我们可以这样读取: ```python with open('your_file.json', 'r', encoding='utf-8') as f: data = json.load(f) ``` ### 步骤3: 将嵌套JSON转换为DataFrame 这里的关键是使用`pd.json_normalize`函数。根据嵌套结构的不同,我们需要调整参数。 #### 情况1: 顶层是字典,数据在某个键下的列表中(如引用[1]中的结构) 如,JSON结构为: ```json { "Data": { "students": [ { "name": "Alice", "age": 20 }, { "name": "Bob", "age": 21 } ] } } ``` 我们可以这样转换: ```python df = pd.json_normalize(data, record_path=['Data', 'students']) ``` #### 情况2: 顶层是列表,每个元素是一个字典(如引用[3]中的结构) 如: ```json [ { "areaName": "碑林区", "eshopList": [ { "shopName": "店铺1", "score": 4.5 }, { "shopName": "店铺2", "score": 4.6 } ] }, ... ] ``` 如果我们想将每个区域的店铺展开,并且保留区域信息,可以这样: ```python # 先展开顶层列表,每个区域的信息作为一行,同时展开区域下的店铺列表 df = pd.json_normalize( data, record_path='eshopList', # 要展开的列表路径 meta=['areaName'], # 要保留的元数据(区域名称) errors='ignore' # 忽略错误(可选) ) ``` #### 情况3: 嵌套 如果嵌套层数很,可能需要次使用`json_normalize`或者结合其他方法。另外,如果嵌套结构不一致,可能需要先对数据进行清洗。 ### 步骤4: 导出DataFrame到Excel ```python df.to_excel('output.xlsx', index=False) # index=False表示不写入行索引 ``` ### 复杂嵌套的处理 如果JSON结构非常复杂,嵌套层字典和列表,我们可以考虑以下方法: 1. 递归展开:编写递归函数将嵌套结构展平。 2. 使用`json_normalize`的`max_level`参数(pandas 1.2.0以上版本支持)来控制展开的层数。 但是,如果数据结构非常复杂,可能需要根据具体结构定制处理逻辑。 ### 示代码(综合引用[1]和[3]的方法) 假设我们有一个类似引用[3]的嵌套结构,但可能更深。我们可以这样处理: ```python import pandas as pd import json # 读取JSON文件 with open('data.json', 'r', encoding='utf-8') as f: data = json.load(f) # 假设data是一个列表,每个元素是一个区域,每个区域包含区域名和店铺列表 # 我们希望将每个店铺的信息展开,同时加上区域名 df_list = [] for area in data: # 对每个区域,将其店铺列表展开成一个DataFrame,并添加区域名列 area_df = pd.json_normalize(area['eshopList']) area_df['areaName'] = area['areaName'] # 添加区域名 df_list.append(area_df) # 合并所有区域的DataFrame result_df = pd.concat(df_list, ignore_index=True) # 导出到Excel result_df.to_excel('output.xlsx', index=False) ``` ### 注意事项 1. 编码问题:确保使用正确的编码(如UTF-8)打开JSON文件。 2. 路径问题:确保文件路径正确。 3. 数据结构:如果JSON结构复杂变,需要处理异常情况(如某些字段缺失)。 ### 相关问题 1. 如何处理JSON嵌套层列表? 2. 如果JSON数据量很大,如何优化处理速度? 3. 如何将JSON文件合并导出到一个Excel文件的不同工作表? 以上方法基本覆盖了常见的嵌套JSONExcel的需求。用户可以根据自己的JSON结构选择合适的方法。</think>### 在Python中处理嵌套JSON数据并导出到Excel表格 处理嵌套JSON数据的关键在于**展平嵌套结构**,以下是三种常用方法(根据嵌套复杂度选择): #### 方法1:使用pandas的json_normalize(推荐简单嵌套) ```python import pandas as pd import json with open('data.json', 'r', encoding='utf-8') as f: data = json.load(f) # 加载JSON数据 # 展平嵌套结构(关键步骤) df = pd.json_normalize( data, record_path=['path', 'to', 'list'], # 指定要展开的列表路径 meta=[ # 保留父级字段 ['parent', 'field1'], ['parent', 'field2'] ], errors='ignore' # 跳过缺失字段 ) df.to_excel('output.xlsx', index=False) # 导出Excel ``` **适用场景**:单层嵌套列表结构(如引用[1]的格式) #### 方法2:嵌套手动解析(复杂嵌套) ```python import xlwt import json with open('data.json', 'r', encoding='utf-8') as f: data = json.load(f) workbook = xlwt.Workbook() sheet = workbook.add_sheet('Data') row_index = 0 # 第一层循环(示) for item in data: # 第二层循环(嵌套对象) for sub_item in item['nested_list']: col_index = 0 # 写入基础字段 sheet.write(row_index, col_index, item['field1']) col_index += 1 # 写入嵌套字段 for key in ['sub_field1', 'sub_field2']: sheet.write(row_index, col_index, sub_item.get(key, '')) col_index += 1 row_index += 1 workbook.save('output.xls') ``` **适用场景**:层不规则嵌套(如引用[3]的格式) #### 方法3:使用tablib(中等复杂度) ```python import json import tablib with open('data.json', 'r', encoding='utf-8') as f: data = json.load(f) headers = tuple(data[0]['nested'][0].keys()) # 从嵌套元素提取表头 dataset = tablib.Dataset(headers=headers) for item in data: for nested_item in item['nested']: dataset.append(tuple(nested_item.values())) # 添加嵌套数据 with open('output.xlsx', 'wb') as f: f.write(dataset.export('xlsx')) # 导出Excel ``` ### 关键处理技巧 1. **路径指定**:使用`record_path`定位嵌套列表(方法1) 2. **元数据保留**:`meta`参数保留父级字段(方法1) 3. **动态表头**:从嵌套结构的首个元素提取key作为表头(方法3) 4. **空值处理**:使用`.get(key, '')`避免KeyError错误(方法2) 5. **编码处理**:始终指定`encoding='utf-8'`防止中文乱码 ### 常见问题解决方案 | 问题类型 | 解决方案 | |---------|----------| | 嵌套 | 逐层循环解析(方法2) | | 字段缺失 | 使用`.get(key, default)` | | 中文乱码 | 文件操作指定`encoding='utf-8'` | | 内存不足 | 分块读取处理(ijson库) | | 动态表头 | 使用`list(nested_dict.keys())`生成 | > 提示:复杂JSON建议先用`json.tool`格式化观察结构: > ```bash > cat data.json | python -m json.tool > ``` ### 相关问题 1. 如何处理JSON中的日期时间格式转换? 2. 当JSON数据量很大(GB级)时如何优化处理效率? 3. 如何将嵌套JSON文件合并导出到同一个Excel的不同工作表? 4. 在展平嵌套结构时如何保留原始层级关系信息? 5. 有哪些工具可以可视化JSON结构辅助解析? [^1]: Jsonexcel。以下为python代码 import pandas as pd import json with open(r'/root/duet/python/json/name1.json',encoding='UTF-8') as f: data = json.loads(f.read()) df = pd.json_normalize( data, record_path =['Data','students'] ) df.to_excel("output.xlsx") [^2]: python中 将json数据转化为excel表格(列表嵌套字典)。代码 #!/usr/bin/python2 # -*- coding: utf-8 -*- import json import tablib # 获取json数据 rows = [{"a": 1}, {"a": 2}, {"a": 3}, {"a": 4}, {"a": 5}] # 将json中的key作为header, 也可以自定义header(列名) header = tuple([i for i in rows[0].keys()]) # header = tuple(["a"]) data = [] # 循环里面的字典,将value作为数据写入进去 for row in rows: body = [] for v in row.values(): body.append(v) data.append(tuple(body)) data = tablib.Dataset(*data, headers=header) with open('guangdiantong.xls', "wb") as f: f.write(data.xls) [^3]: 用python实现嵌套json数据存入excel表格——以美食数据python代码,这里实现的是存入各个区前30家店铺信息: import json,xlwt # 解析json def readJsonfile(): jsobj=json.load(open(r'F:\毕业论文\统计分析.json')) return jsobj #转换为excel def Json2Excel(): jsonfile=readJsonfile() workbook=xlwt.Workbook() sheet1=workbook.add_sheet('各区店铺(前30)') start_Row=start_Column=0 # 第一层循环,依次取出区位字典,t代表区位号 for t in range(0,len(jsonfile)): regiondict=jsonfile[t] region=regiondict["areaName"] sheet1.write(start_Row,start_Column,region) shopList=regiondict["eshopList"] # 第二层循环,依次取出商家列表,i代表商家号 for i in range(0,len(shopList)): one_shop=shopList[i] # 构建空列表存放商字典中的value one_shop_list=[] for x in one_shop.values(): one_shop_list.append(x) # 第三层循环,依次按列写入商家信息 for j in range(1,13): next_Row=start_Row+i sheet1.write(next_Row,j,one_shop_list[j]) workbook.save('西安美食数据.xls') # 避免商家不足30的状况 if i !=29: next_Row=start_Row+29 start_Row=next_Row+1 j=1 Json2Excel()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值