You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

原代码核心问题分析

  1. JSON解析冗余+数据提取错误:
    • 重复调用usergroupresponse.json()和json.loads(usergroupresponse.text),前者已能直接返回解析后的字典。
    • 未定位到API返回的groups数组,直接遍历顶层字典的键(如"groups"),导致把字符串"groups"拆分成单个字符写入CSV。
  2. 错误的字符串分割操作:
    • 代码中row = result.split(',')完全多余,会把字典对象转成字符串后乱分割,直接导致输出异常。
  3. 文件写入逻辑不合理:
    • 每次分页请求都创建新的CSV文件,无法合并所有分页数据;若需单文件存储应使用追加模式。
  4. 数组字段未处理:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:17:45