Python Pandas生成Excel与JSON输出字符数不一致问题求助
问题排查与代码优化方案
核心问题分析
你遇到的字符缺失大概率是以下两个原因之一,结合你给出的字符数(缺失后30438,接近32767),Excel单元格字符上限是最可能的诱因:
- Excel的.xlsx格式单个单元格最多支持32767个字符,超出部分会被自动截断
pd.json_normalize处理嵌套JSON时,可能丢失深层结构或压缩数组内容
分步排查与解决
1. 确认数据是否进入DataFrame
在导出Excel前,先对比DataFrame和原始数据的内容长度,定位问题环节:
# 在df = pd.json_normalize(res)之后添加 # 替换成你观察到缺失的字段名 print("DataFrame目标字段长度:", len(df.iloc[0]['目标字段名'])) print("原始data对应内容长度:", len(json.dumps(res[0])))
如果两者长度一致,说明问题出在Excel导出环节;如果不一致,就是json_normalize的扁平化处理丢失了数据。
2. 解决Excel字符限制问题
如果是Excel的字符上限导致,有两种实用方案:
- 改用CSV格式导出:CSV没有单元格字符限制,可完整保留所有内容
df.to_csv('MyGreatExcelFile.csv', index=False, header=True) - 拆分超长内容:如果必须用Excel,可将超长字段按固定长度拆分(或保留为多行),避免截断
3. 修复JSON扁平化丢失数据的问题
如果json_normalize丢失了嵌套数据,改用直接存储JSON字符串的方式,避免扁平化导致的内容丢失:
# 替换原来的df = pd.json_normalize(res) df = pd.DataFrame({'raw_data': [json.dumps(item) for item in res]}) # 替换所有换行符 df['raw_data'] = df['raw_data'].str.replace(r'[\r\n]', '|', regex=True)
4. 确保API请求获取完整数据
虽然加了time.sleep(0.5),仍需确认请求是否成功且完整:
# 在r = requests.request(...)之后添加 if r.status_code != 200: print(f"请求失败,状态码: {r.status_code},URL: {url}") continue # 检查响应内容与解析后JSON的长度是否一致 raw_len = len(r.text) json_len = len(json.dumps(data)) if raw_len != json_len: print(f"警告: {myUrl} 的响应可能被截断")
优化后的完整代码
import requests import json import time import pandas as pd # 读取URL ID,用原生文件操作更简洁 with open("url_ids.txt", "r") as f: url_list = [line.strip() for line in f if line.strip()] res = [] for url_id in url_list: url = f"https://myrandomwebsite.com/api/v3/event/{url_id}/teams" headers = { # 填入你的headers内容 } try: r = requests.get(url, headers=headers) r.raise_for_status() # 主动触发HTTP错误 data = r.json() # 验证数据完整性 if len(r.text) != len(json.dumps(data)): print(f"警告: {url_id} 的响应可能不完整") res.append(data) time.sleep(0.5) except Exception as e: print(f"处理 {url_id} 时出错: {str(e)}") continue # 直接存储原始JSON字符串,避免扁平化丢失数据 df = pd.DataFrame({'raw_data': [json.dumps(item) for item in res]}) df['raw_data'] = df['raw_data'].str.replace(r'[\r\n]', '|', regex=True) # 用CSV导出避免Excel字符限制 df.to_csv('MyGreatExcelFile.csv', index=False, header=True) # 若必须用Excel,需先处理超长字段再导出 # df.to_excel('MyGreatExcelFile.xlsx', sheet_name='MyGreatExcelFile', header=True)
内容的提问来源于stack exchange,提问作者BulkingBaguette
相关产品推荐
相关产品推荐

