使用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
额外修复点说明
- 新增响应解析步骤:将
requests.get的结果先转为JSON格式数据,才能按字典/列表方式遍历取值。 - 修正
name字段取值:从嵌套字典中提取具体子字段,避免拿到字典类型数据。 - 修正表头定义:
('name',)是元组格式,原代码('name')会被识别为字符串,导致表头写入错误。 - 补充数据收集逻辑:将提取的国家名称添加到
rows列表,确保Excel能写入数据。
内容的提问来源于stack exchange,提问作者KlaoBurn
相关产品推荐
相关产品推荐

