Python 将JSON转换为CSV文件:字符串索引必须是整数错误,而我已经使用了JSON.loads()

Python 将JSON转换为CSV文件:字符串索引必须是整数错误,而我已经使用了JSON.loads(),python,json,api,csv,Python,Json,Api,Csv,我想从API中提取数据并以表的形式存储。因此,我提取了JSON格式的数据,现在试图将其存储在.csv文件中,但在这样做时,我得到了一个错误:字符串索引必须是整数 我使用的代码如下: import urllib2 import json import csv f = urllib2.urlopen('https://api.weather.com/v1/location/KORD:9:US/observations/historical.json?units=e&startDate=201

我想从API中提取数据并以表的形式存储。因此,我提取了JSON格式的数据,现在试图将其存储在.csv文件中,但在这样做时,我得到了一个错误:字符串索引必须是整数

我使用的代码如下:

import urllib2
import json
import csv
f = urllib2.urlopen('https://api.weather.com/v1/location/KORD:9:US/observations/historical.json?units=e&startDate=20140703&endDate=20140704&apiKey=742a31ced27a477045')
json_string = f.read()
x = json.loads(json_string)
f = csv.writer(open("test.csv", "wb+"))

# For CSV Headers
f.writerow(["obs_id", "obs_name", "temp", "valid_time_gmt"])
for x in x:
    f.writerow([x["observations"]["obs_id"],
                x["observations"]["obs_name"],
                x["observations"]["temp"],
               x["observations"]["valid_time_gmt"]])

f.close()
如果您看到,我已经使用了json.loads(),那么理想情况下,这个问题不应该出现在这里。请让我知道我错过了什么

JSON数据格式如下:

{ 
  "metadata": { 
    "language": "en-US",
    "transaction_id": "1484310885350:-90975020",
    "version": "1",
    "location_id": "KORD:9:US",
    "units": "e",
    "expire_time_gmt": 1484314485,
    "status_code": 200
  },
  "observations": [
     { "key": "KORD", "obs_id": "KORD", "obs_name": "Chicago/O'Hare", "valid_time_gmt": 1404453060, "day_ind": "N", "temp": 61 }, 
     { "key": "KORD", "obs_id": "KORD", "obs_name": "Chicago/O'Hare", "valid_time_gmt": 1404456660, "day_ind": "N", "temp": 60 }
  ]
}

json数据是一个嵌套的字典列表字典结构。 如果对x中的x进行迭代
,您将获得数据第一级的键(字符串)(例如
元数据
),并且不能使用另一个字符串(例如
obs_id
)作为字符串对象的索引

下面的循环将迭代观察结果并将其写入csv文件

for o in x["observations"]:
    f.writerow([o["obs_id"],
                o["obs_name"],
                o["temp"],
                o["valid_time_gmt"]])
x[“观察”]
将获得字典列表<代码>中的o将迭代此列表中的每个元素。因为每个
o
都是另一个字典,所以您可以引用它的键

示例的完整代码包括: 1) 更好的csv文件处理程序 2) 对外部API的调用被示例数据内联替换 3) 数据的适当迭代

import json
import csv

# import urllib2
# f = urllib2.urlopen('https://api.weather.com/v1/location/KORD:9:US/observations/historical.json?units=e&startDate=20140703&endDate=20140704&apiKey=742a31ced27a477045')
# json_string = f.read()

json_string = """
{ 
  "metadata": { 
    "language": "en-US",
    "transaction_id": "1484310885350:-90975020",
    "version": "1",
    "location_id": "KORD:9:US",
    "units": "e",
    "expire_time_gmt": 1484314485,
    "status_code": 200
  },
  "observations": [
     { "key": "KORD", "obs_id": "KORD", "obs_name": "Chicago/O'Hare", "valid_time_gmt": 1404453060, "day_ind": "N", "temp": 61 }, 
     { "key": "KORD", "obs_id": "KORD", "obs_name": "Chicago/O'Hare", "valid_time_gmt": 1404456660, "day_ind": "N", "temp": 60 }
  ]
}
"""
x = json.loads(json_string)

with open("test.csv", "wb+") as fw:
    f = csv.writer(fw)

    # For CSV Headers
    f.writerow(["obs_id", "obs_name", "temp", "valid_time_gmt"])
    for o in x["observations"]:
        f.writerow([o["obs_id"],
                o["obs_name"],
                o["temp"],
                o["valid_time_gmt"]])

for循环中的错误:
for x in x
。我认为您需要将第6行的
x
重命名为
data
。还有第二个错误。您可能应该将
data
设置为
json.loads(json_string)['metadata']
对不起,但是@karol您能帮我做一下上述评论吗。您是否建议将键观察下的键、值对作为字典传递,然后迭代它们以填充.csv?基本上我们要怎么做?对于您提供的示例数据,For循环中的代码将完成这项工作。我对答案中的解释做了一点修改。我以您的方式使用了迭代,但我仍然在“for o in x[“observations”]”中遇到了相同的问题。我想,它仍然将x[“observations”]识别为字符串而不是整数。我又添加了一个说明(错误源)和一个完整的代码,我已经测试过了