“TypeError : 문자열 인덱스는 정수 여야합니다”라는 메시지가 나타나는 이유는 무엇입니까?


219

나는 파이썬을 배우고 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"]])

"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

내가 여기서 무엇을 놓치고 있습니까? "문자열 지수"는 무엇입니까? 이 작업을 마치면 더 많은 문제가 발생할 것이지만, 지금은이 기능이 작동하기를 바랍니다.

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...

당신이 빠진 것은 print repr(data)또는import pprint; pprint.pprint(data)
John Machin

답변:


116

item코드의 문자열 일 가능성이 높습니다. 문자열 인덱스는 대괄호 안에있는 인덱스입니다 (예 :) gravatar_id. 먼저 data변수를 확인하여 거기에서받은 것을 확인합니다 . 나는 data그것이 사전의 목록이어야하지만 문자열 목록 (또는 적어도 하나의 문자열을 포함하는 목록)이라고 생각합니다.


158

변수 item는 문자열입니다. 색인은 다음과 같습니다.

>>> mystring = 'helloworld'
>>> print mystring[0]
'h'

위의 예는 0문자열 의 색인을 사용 하여 첫 번째 문자를 나타냅니다.

문자열은 사전과 같이 문자열 인덱스를 가질 수 없습니다. 그래서 이것은 작동하지 않습니다 :

>>> mystring = 'helloworld'
>>> print mystring['stringindex']
TypeError: string indices must be integers

42

dataA는 dict객체. 따라서 다음과 같이 반복하십시오.

파이썬 2

for key, value in data.iteritems():
    print key, value

파이썬 3

for key, value in data.items():
    print(key, value)

36

슬라이스 표기법의 TypeError str[a:b]

TL은, DR : 용도 콜론 : 대신의 쉼표 두 개의 지표들 사이의 abstr[a:b]


작업 할 때 문자열슬라이스 표기법 (A 일반적인 시퀀스 동작을 ),이 일이 발생할 수 있습니다 TypeError그들은 분명히 경우에도 인덱스가 정수해야한다는 지적 발생합니다.

>>> my_string = "hello world"
>>> my_string[0,5]
TypeError: string indices must be integers

우리는 분명히 슬라이스 표기법에 대한 인덱스에 대해 두 개의 정수를 전달했습니다. 문제가 무엇입니까?

이 오류는 오류 메시지가 약간 오도되기 때문에 특히 Python을 시작할 때 매우 실망 스럽습니다.

설명

우리는 암시 적으로 전달 된 두 개의 정수의 튜플 우리가 전화했을 때 슬라이스 표기법 (0 ~ 5) my_string[0,5]때문에 0,5같은 튜플로 평가 (심지어 괄호없이)으로는 (0,5)할 것입니다.

쉼표 ,는 실제로 파이썬이 무언가를 튜플로 평가하기에 충분합니다.

>>> my_variable = 0,
>>> type(my_variable)
<class 'tuple'>

우리가 거기서 한 일은 이번에는 명시 적으로 :

>>> my_string = "hello world"
>>> my_tuple = 0, 5
>>> my_string[my_tuple]
TypeError: string indices must be integers

적어도 오류 메시지는 의미가 있습니다.

해결책

두 정수를 올바르게 분리하려면 쉼표 ,콜론 으로 바꿔야 :합니다.

>>> my_string = "hello world"
>>> my_string[0:5]
'hello'

보다 명확하고 유용한 오류 메시지는 다음과 같습니다.

TypeError: string indices must be integers (not tuple)

좋은 오류 메시지는 사용자에게 자신이 잘못한 것을 직접 보여 주며 문제를 해결하는 방법이 더 분명했을 것입니다.

[다음에 오류 설명 메시지를 작성해야 할 책임이있는 경우,이 예를 생각해보고 오류 메시지에 이유 또는 기타 유용한 정보를 추가하여 다른 사람들이 무엇이 잘못되었는지 이해할 수 있도록하십시오.]

교훈

  • 슬라이스 표기 콜론을 사용 :(예를 단계 범위의 인덱스를 분리 str[from:to:step])
  • 튜플은 쉼표로 정의된다 ,(예 t = 1,)
  • 사용자가 오류를 이해하도록 오류 메시지에 정보를 추가하십시오.

건배와 행복한 프로그래밍
winklerrr


[이 질문에 이미 답변 된 것으로 알고 있으며 이는 스레드 스타터가 요청한 질문이 아니지만 위의 문제로 인해 동일한 오류 메시지가 표시됩니다. 최소한 그 작은 오타를 찾는 데 꽤 시간이 걸렸습니다.

따라서 이것이 같은 오류를 발견 한 다른 사람이 그 작은 실수를 발견하는 데 도움이되기를 바랍니다.]


0

쉼표가없는 경우 발생할 수 있습니다. 나는 두 개의 튜플 목록을 가지고 있었는데, 각각은 첫 번째 위치에 문자열로 구성되고 두 번째 튜플에 목록으로 구성되었습니다. 한 경우에는 튜플의 첫 번째 구성 요소 뒤에 쉼표를 잘못 생략했으며 인터프리터는 첫 번째 구성 요소를 인덱싱하려고한다고 생각했습니다.


0

Pandas와 비슷한 문제가 있었으므로 iterrows () 함수를 사용하여 iterrows에 대한 Pandas 데이터 세트 Pandas 설명서를 반복해야합니다.

data = pd.read_csv('foo.csv')
for index,item in data.iterrows():
    print('{} {}'.format(item["gravatar_id"], item["position"]))

함수에 의해 반환되는 데이터 집합의 인덱스를 처리해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.