无法将API调用返回数据导出为CSV的问题求助
问题:API返回JSON转CSV时出现AttributeError错误
我尝试使用以下Python代码将API调用返回的JSON数据导出为CSV文件,但运行时出现错误。
原代码
import requests import csv import json r='http://openapi.seoul.go.kr:8088/504949776872656935396c46496663/json/airPolutionMeasuring1Hour/1/50/' response=requests.get(r) output = response.text jsonresponse=json.loads(output) with open ('data_02.csv', 'w', newline ='') as csvfile: fieldnames=['DATA_DT', 'LOC_CODE', 'ITEM_CODE', 'DATA_VALUE', 'DATA_STATE', 'DATA_NOVER', 'DATA_ROVER', "REGIST_DT"] writer=csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for row in jsonresponse: writer.writerow(row)
报错信息
Traceback (most recent call last): File "/Users/xxx/PycharmProjects/api_request/export_csv_Test02.py", line 16, in
writer.writerow(row) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/csv.py", line 154, in writerow
return self.writer.writerow(self._dict_to_list(rowdict)) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/csv.py", line 147, in _dict_to_list
wrong_fields = rowdict.keys() - self.fieldnames AttributeError: 'str' object has no attribute 'keys'
错误原因
报错核心是'str' object has no attribute 'keys',原因如下:
- API返回的JSON是嵌套结构,外层字典包含
airPolutionMeasuring1Hour键,其下的row字段才是存储目标数据的字典列表 - 原代码中
for row in jsonresponse是遍历外层字典的键(每个键为字符串类型),而非实际的数据字典,传给writer.writerow()自然报错,因为该方法要求接收字典类型参数
解决方法
- 定位实际数据列表:通过
json_data['airPolutionMeasuring1Hour']['row']获取存储数据的字典列表 - 简化JSON解析:直接使用
response.json()替代json.loads(response.text),更高效简洁
修正后的代码
import requests import csv url = 'http://openapi.seoul.go.kr:8088/504949776872656935396c46496663/json/airPolutionMeasuring1Hour/1/50/' response = requests.get(url) json_data = response.json() # 定位到实际存储数据的字典列表 data_rows = json_data['airPolutionMeasuring1Hour']['row'] with open('data_02.csv', 'w', newline='', encoding='utf-8') as csvfile: fieldnames = ['DATA_DT', 'LOC_CODE', 'ITEM_CODE', 'DATA_VALUE', 'DATA_STATE', 'DATA_NOVER', 'DATA_ROVER', "REGIST_DT"] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() # 遍历数据字典列表写入CSV for row in data_rows: writer.writerow(row)
额外添加encoding='utf-8'参数,避免导出CSV时出现中文乱码问题。
内容的提问来源于stack exchange,提问作者user12109841
相关产品推荐
相关产品推荐

