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

Python调用API获取subTarefa的nome字段出错求助

问题

调用Python接口获取数据时,除subTarefa的nome字段外,其他数据均可正常提取。遇到两个问题:

  • 原代码用i['subTarefa']['nome']会报错,因为subTarefa是数组类型
  • 直接存储i['subTarefa']时,openpyxl无法将空数组写入Excel,抛出ValueError

API返回结构示例

{
    "data": [
        {
            "id": 999,
            "nome": "Nome Tarefa Teste",
            "codigo": "T01",
            "fase": {
                "id": 22,
                "nome": "Fase Teste",
                "codigo": "F01"
            },
            "descricaoHtml": "<p>Descrição Html</p>",
            "prioridade": 0,
            "situacao": 2,
            "dtCriacao": "2020-07-06T13:36:29Z",
            "dtInicio": "2020-07-06T03:00:00Z",
            "dtFim": "2020-07-23T03:00:00Z",
            "dtConclusao": "2020-07-23T03:00:00Z",
            "porcentagemConclusao": 0.00,
            "anexo": [
                {
                    "id": 5,
                    "nome": "Slide1.png",
                    "url": "https://sults.com/Slide1.png",
                    "tamanho": 1545,
                    "dtCriacao": "2019-07-03T03:09:17Z"
                }
            ],
            "subTarefa": [
                {
                    "id": 10,
                    "nome": "Primeira Subtarefa",
                    "dtCriacao": "2022-11-14T14:54:16Z",
                    "dtConcluido": null
                }
            ]
        }
    ],
    "start": 0,
    "limit": 50,
    "size": 3,
    "totalPage": 1
}

原代码

for i in data['data']:
    nome.append(i['nome'])
    codigoTarefa.append(i['codigo'])
    situacaoTarefa.append(i['situacao'])
    faseNome.append(i['fase']['nome'])
    dtFimTarefa.append(i['dtFim'])
    dtInicioTarefa.append(i['dtInicio'])
    subTarefa.append(i['subTarefa']['nome'])

报错信息

File "C:\Users\Henrique Ferraz\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\openpyxl\cell\cell.py", line 215, in value
    self._bind_value(value)
  File "C:\Users\Henrique Ferraz\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\openpyxl\cell\cell.py", line 184, in _bind_value
    raise ValueError("Cannot convert {0!r} to Excel".format(value))
ValueError: Cannot convert [] to Excel 
解决方案

需要针对subTarefa的数组特性,先判断数组状态,再提取nome并转换成Excel可识别的格式,避免直接写入数组或错误访问字典键。

场景1:提取所有子任务名称(逗号分隔)

如果一个任务包含多个子任务,将所有子任务的nome拼接成字符串,空数组则返回空字符串:

for i in data['data']:
    nome.append(i['nome'])
    codigoTarefa.append(i['codigo'])
    situacaoTarefa.append(i['situacao'])
    faseNome.append(i['fase']['nome'])
    dtFimTarefa.append(i['dtFim'])
    dtInicioTarefa.append(i['dtInicio'])
    
    # 处理subTarefa:提取所有nome,空数组返回空字符串
    subtarefas = i.get('subTarefa', [])
    subtarefa_nomes = ', '.join([st['nome'] for st in subtarefas])
    subTarefa.append(subtarefa_nomes)

场景2:仅提取第一个子任务名称

如果只需要第一个子任务的名称,空数组时返回自定义默认值(比如"无"):

for i in data['data']:
    nome.append(i['nome'])
    codigoTarefa.append(i['codigo'])
    situacaoTarefa.append(i['situacao'])
    faseNome.append(i['fase']['nome'])
    dtFimTarefa.append(i['dtFim'])
    dtInicioTarefa.append(i['dtInicio'])
    
    # 处理subTarefa:取第一个子任务的nome,空数组返回"无"
    subtarefas = i.get('subTarefa', [])
    subtarefa_nome = subtarefas[0]['nome'] if subtarefas else "无"
    subTarefa.append(subtarefa_nome)

关键说明

  • 用i.get('subTarefa', [])确保即使subTarefa键不存在,也能返回空数组,避免KeyError
  • 将数组转换成字符串(或默认文本)后再写入Excel,规避openpyxl无法处理数组的问题

内容的提问来源于stack exchange,提问作者Henrique Ferraz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 11:27:57