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
相关产品推荐
相关产品推荐

