为什么我看到"TypeError:字符串索引必须是整数"?

Ama*_*nda 173 python json github

我正在玩学习python并尝试将github问题变成可读的形式.使用有关如何将JSON转换为CSV的建议?我想出了这个:

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"]])
Run Code Online (Sandbox Code Playgroud)

其中"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
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?哪个是"字符串索引"?我敢肯定,一旦我开始工作,我会有更多的问题,但就目前而言,我只是喜欢这个工作!

更新: 当我for简单地调整声明时

for item in data:
    print item
Run Code Online (Sandbox Code Playgroud)

我得到的是......"问题" - 所以我做了一些更基本的错误.这是我的一些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...
Run Code Online (Sandbox Code Playgroud)

当我打印data它看起来像是真的很奇怪:

{u'issues': [{u'body': u'Add missing paging (Older>>) lin...
Run Code Online (Sandbox Code Playgroud)

blu*_*ume 137

变量item是一个字符串.索引如下所示:

>>> mystring = 'helloworld'
>>> print mystring[0]
'h'
Run Code Online (Sandbox Code Playgroud)

上面的示例使用0字符串的索引来引用第一个字符.

字符串不能有字符串索引(如字典可以).所以这不起作用:

>>> mystring = 'helloworld'
>>> print mystring['stringindex']
TypeError: string indices must be integers
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,当作者忘记正确嵌套调用语句时,这也是嵌套字典中常见的错误,例如“item['findX']”而不是第一个中的“dict[item]['findX']”例如,您试图在字符串/键“item”中查找索引“findX”..希望这是有道理的 (7认同)

Tam*_*más 95

item很可能是代码中的字符串; 字符串索引是方括号中的索引,例如gravatar_id.所以我先检查你的data变量,看看你在那里收到了什么; 我猜这data是一个字符串列表(或至少包含至少一个字符串的列表),而它应该是一个字典列表.


Joh*_*hin 39

data是一个dict对象.所以,像这样迭代它:

Python 2

for key, value in data.iteritems():
    print key, value
Run Code Online (Sandbox Code Playgroud)

Python 3

for key, value in data.items():
    print(key, value)
Run Code Online (Sandbox Code Playgroud)


win*_*rrr 22

TL; DR:使用一个冒号 str[a:b]代替逗号在两个索引之间:ab

Slice Notation的TypeError str[a:b]

当使用字符串切片表示法(一个常见的序列操作)时,可能会发生a TypeError被引发,指出索引必须是整数,即使它们显然是.

>>> my_string = "hello world"
>>> my_string[0,5]
TypeError: string indices must be integers
Run Code Online (Sandbox Code Playgroud)

我们显然将索引的两个整数传递给切片表示法,对吗?那么这里的问题是什么?

这个错误可能非常令人沮丧 - 特别是在学习Python的开始 - 因为错误消息有点误导.

说明

当我们调用时,我们隐式地将两个整数(0和5)的元组传递给切片表示法,my_string[0,5]因为0,5(即使没有括号)计算的结果也是相同的元组(0,5).

一个逗号,实际上足以让Python将某些东西评估为元组:

>>> my_variable = 0,
>>> type(my_variable)
<class 'tuple'>
Run Code Online (Sandbox Code Playgroud)

那么我们在那里做了什么,这次明确地说:

>>> my_string = "hello world"
>>> my_tuple = 0, 5
>>> my_string[my_tuple]
TypeError: string indices must be integers
Run Code Online (Sandbox Code Playgroud)

现在,至少,错误消息是有道理的.

我们需要用冒号替换逗号 ,以正确分隔两个整数: :

>>> my_string = "hello world"
>>> my_string[0:5]
'hello'
Run Code Online (Sandbox Code Playgroud)

更清晰,更有帮助的错误消息可能是这样的:

TypeError: string indices must be integers (not tuple)
Run Code Online (Sandbox Code Playgroud)

这将直接显示我们所做的事情,并且更明显的是要改变什么.

[因此,下次当您发现自己负责编写错误描述消息时,请考虑此示例并将原因或其他有用信息添加到错误消息中,以便让您和其他人了解出现了什么问题.

得到教训

  • 切片表示法使用冒号:分隔其索引(和步骤范围,例如str[from:to:step])
  • 元组由逗号定义,(例如t = 1,)
  • 为错误消息添加一些信息,以便用户了解错误

干杯和快乐的编程
winklerrr


[我知道这个问题已经回答了,这不是线程初学者问的问题,但我来到这里是因为上述问题会导致相同的错误信息.至少我花了很长时间才发现这个小错字.

所以我希望这能帮助那些偶然发现同样错误的人,并节省一些时间来发现这个小小的错误.