为什么我看到“TypeError:string索引必须是整数”?
我正在玩Python和学习,并试图让github问题成为一个可读的forms。 使用关于如何将JSON转换为CSV的build议? 我想出了这个:
import json import csv f=open('issues.json') data = json.load(f) f.close() f=open("issues.csv","wb+") csv_file=csv.writer(f) csv_file.writerow(["gravatar_id","position","number","votes","created_at","comments","body","title","updated_at","html_url","user","labels","state"]) for item in data: csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]])
其中“issues.json”是包含我的github问题的json文件。 当我尝试运行时,我得到了
File "foo.py", line 14, in <module> csv_file.writerow([item["gravatar_id"], item["position"], item["number"], item["votes"], item["created_at"], item["comments"], item["body"], item["title"], item["updated_at"], item["html_url"], item["user"], item["labels"], item["state"]]) TypeError: string indices must be integers
我在这里错过了什么? 哪些是“string索引”? 我确信,一旦我得到这个工作,我会有更多的问题,但现在,我只是喜欢这个工作!
更新:当我调整简单的for
语句
for item in data: print item
我得到的是…“问题” – 所以我正在做一些更基本的错误。 这是我的json的一些:
{"issues":[{"gravatar_id":"44230311a3dcd684b6c5f81bf2ec9f60","position":2.0,"number":263,"votes":0,"created_at":"2010/09/17 16:06:50 -0700","comments":11,"body":"Add missing paging (Older>>) links...
当我打印data
,看起来好像很奇怪:
{u'issues': [{u'body': u'Add missing paging (Older>>) lin...
item
很可能是你的代码中的一个string; string索引是方括号中的索引,例如gravatar_id
。 所以我首先检查你的data
variables,看看你在那里收到什么; 我猜这个data
是一个string列表(或者至less是一个包含至less一个string的列表),而它应该是一个字典列表。
variablesitem
是一个string。 索引看起来像这样:
>>> mystring = 'helloworld' >>> print mystring[0] 'h'
上面的例子使用string的0
索引来引用第一个字符。
string不能有string索引(就像字典一样)。 所以这不起作用:
>>> mystring = 'helloworld' >>> print mystring['stringindex'] TypeError: string indices must be integers
data
是一个dict
对象。 所以,像这样迭代它:
Python 2
for key, value in data.iteritems(): print key, value
Python 3
for key, value in data.items(): print(key, value)
这可能发生,如果一个共同的失踪。 当我有一个两元组列表时,我碰到了它,每个元组由第一个位置的一个string和第二个位置的一个列表组成。 在一个例子中,我错误地忽略了一个元组的第一个元素之后的逗号,解释者认为我试图索引第一个元素。