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

使用Python将JSON转XLS时遇TypeError错误求助

错误原因与修复方案

触发TypeError: byte indices must be integers or slices, not str的原因

  • requests.get()返回的是Response响应对象,直接遍历这个对象会逐个读取响应的字节内容,此时record是单个字节,自然不能用字符串'name'作为索引。必须先将响应解析为JSON格式的列表/字典。
  • 目标API返回的name是嵌套字典结构(如{'common': 'xxx', 'official': 'xxx'}),直接取record['name']会得到字典,需要指定具体子字段才能拿到可用的国家名称。

修正后的完整代码

import os
import json
import win32com.client as win32  # pip install pywin32
import requests

"""
Step 1.1 读取并解析JSON数据
"""
response = requests.get("https://restcountries.com/v3.1/all")
# 解析响应为JSON格式的列表
json_data = response.json()

"""
Step 1.2 整理数据为二维表格结构
"""
rows = []

for record in json_data:
    # 取国家的常用名称,也可以换成official取正式名称
    country_name = record['name']['common']
    rows.append([country_name])  # 用列表包装,适配后续Excel写入逻辑

"""
Step 2. 写入Excel表格
"""
ExcelApp = win32.Dispatch('Excel.Application')
ExcelApp.Visible = True

wb = ExcelApp.Workbooks.Add()
ws = wb.Worksheets(1)

# 注意:元组需要加逗号,否则会被识别为字符串
header_labels = ('name',)

# 写入表头
for indx, val in enumerate(header_labels):
    ws.Cells(1, indx + 1).Value = val

# 写入数据行
row_tracker = 2
column_size = len(header_labels)

for row in rows:
    ws.Range(
        ws.Cells(row_tracker, 1),
        ws.Cells(row_tracker, column_size)
    ).value = row
    row_tracker += 1

# 保存文件,51对应xlsx格式
wb.SaveAs(os.path.join(os.getcwd(), 'Json output.xlsx'), 51)
wb.Close()
ExcelApp.Quit()
ExcelApp = None

额外修复点说明

  1. 新增响应解析步骤:将requests.get的结果先转为JSON格式数据,才能按字典/列表方式遍历取值。
  2. 修正name字段取值:从嵌套字典中提取具体子字段,避免拿到字典类型数据。
  3. 修正表头定义:('name',)是元组格式,原代码('name')会被识别为字符串,导致表头写入错误。
  4. 补充数据收集逻辑:将提取的国家名称添加到rows列表,确保Excel能写入数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:18:26