Python捕获JSON响应到CSV出错,无法导出全部结果
无法将所有JSON结果捕获到CSV的问题修复
问题概况
运行Python代码尝试将API返回的JSON数据导出到CSV时,仅得到异常输出(如将"groups"拆分为单个字符列),无法正确捕获所有群组数据。API返回的JSON结构包含groups数组,每个元素是群组详情字典;原代码输出示例:
title,description,owner,members,pending_members,creation_date,modification_date g,r,o,u,p,s
原代码核心问题分析
- JSON解析冗余+数据提取错误:
- 重复调用
usergroupresponse.json()和json.loads(usergroupresponse.text),前者已能直接返回解析后的字典。 - 未定位到API返回的
groups数组,直接遍历顶层字典的键(如"groups"),导致把字符串"groups"拆分成单个字符写入CSV。
- 重复调用
- 错误的字符串分割操作:
- 代码中
row = result.split(',')完全多余,会把字典对象转成字符串后乱分割,直接导致输出异常。
- 代码中
- 文件写入逻辑不合理:
- 每次分页请求都创建新的CSV文件,无法合并所有分页数据;若需单文件存储应使用追加模式。
- 数组字段未处理:
members和pending_members是数组类型,直接写入CSV会显示为Python列表格式(如['member1', 'member2']),需转成逗号分隔的字符串优化可读性。
修正后的代码
import csv import json import sys # 假设session已提前初始化 Test = "your-test-domain-" # 替换为实际的Test变量值 UsergroupURL = f"https://{Test}3ds.com" select_params = "select=title,description,owner,members,pending_members,creation_date,modification_date" skip_value = 0 data = {} # 统一输出到单个CSV文件,避免分页生成多个文件 csv_filename = "all_usergroups.csv" # 先写入表头(仅执行一次) with open(csv_filename, 'w', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) writer.writerow(["title", "description", "owner", "members", "pending_members", "creation_date", "modification_date"]) while True: UsergroupsURL = f"{UsergroupURL}/v1.00/usersgroup?{select_params}&top=100&skip={skip_value}" usergroupresponse = session.get(UsergroupsURL, data=data) if usergroupresponse.status_code != 200: Failmsg = f"Failed to retrieve usergroup. Status code: {usergroupresponse.status_code}" sys.exit(Failmsg) # 仅需一次JSON解析 results = usergroupresponse.json() # 提取groups数组,若不存在则终止循环 groups = results.get("groups", []) if not groups: break # 追加写入当前分页的群组数据 with open(csv_filename, 'a', newline='', encoding='utf-8') as csvfile: writer = csv.writer(csvfile) for group in groups: if isinstance(group, dict): # 将数组字段转为逗号分隔的字符串 members = ','.join(group.get("members", [])) pending_members = ','.join(group.get("pending_members", [])) row = [ group.get("title"), group.get("description"), group.get("owner"), members, pending_members, group.get("creation_date"), group.get("modification_date") ] writer.writerow(row) else: print(f"跳过非字典类型数据: {group}") skip_value += 100
关键修改说明
- 直接提取API返回的
groups数组作为数据来源,避免遍历顶层字典键导致的错误。 - 移除冗余的JSON解析和错误的字符串分割操作。
- 改为单文件写入:先一次性写入表头,后续分页数据以追加模式写入,保证所有数据在同一个CSV中。
- 处理数组类型字段:将
members和pending_members数组转为逗号分隔的字符串,符合CSV的可读性要求。
内容的提问来源于stack exchange,提问作者Mittu BR
相关产品推荐
相关产品推荐

