나는 파이썬을 배우고 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...
답변
item
코드의 문자열 일 가능성이 높습니다. 문자열 인덱스는 대괄호 안에있는 인덱스입니다 (예 🙂 gravatar_id
. 먼저 data
변수를 확인하여 거기에서받은 것을 확인합니다 . 나는 data
그것이 사전의 목록이어야하지만 문자열 목록 (또는 적어도 하나의 문자열을 포함하는 목록)이라고 생각합니다.
답변
변수 item
는 문자열입니다. 색인은 다음과 같습니다.
>>> mystring = 'helloworld'
>>> print mystring[0]
'h'
위의 예는 0
문자열 의 색인을 사용 하여 첫 번째 문자를 나타냅니다.
문자열은 사전과 같이 문자열 인덱스를 가질 수 없습니다. 그래서 이것은 작동하지 않습니다 :
>>> mystring = 'helloworld'
>>> print mystring['stringindex']
TypeError: string indices must be integers
답변
data
A는 dict
객체. 따라서 다음과 같이 반복하십시오.
파이썬 2
for key, value in data.iteritems():
print key, value
파이썬 3
for key, value in data.items():
print(key, value)
답변
슬라이스 표기법의 TypeError str[a:b]
TL은, DR : 용도 콜론 :
대신의 쉼표 두 개의 지표들 사이의 a
및 b
의str[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
[이 질문에 이미 답변 된 것으로 알고 있으며 이는 스레드 스타터가 요청한 질문이 아니지만 위의 문제로 인해 동일한 오류 메시지가 표시됩니다. 최소한 그 작은 오타를 찾는 데 꽤 시간이 걸렸습니다.
따라서 이것이 같은 오류를 발견 한 다른 사람이 그 작은 실수를 발견하는 데 도움이되기를 바랍니다.]
답변
쉼표가없는 경우 발생할 수 있습니다. 나는 두 개의 튜플 목록을 가지고 있었는데, 각각은 첫 번째 위치에 문자열로 구성되고 두 번째 튜플에 목록으로 구성되었습니다. 한 경우에는 튜플의 첫 번째 구성 요소 뒤에 쉼표를 잘못 생략했으며 인터프리터는 첫 번째 구성 요소를 인덱싱하려고한다고 생각했습니다.
답변
Pandas와 비슷한 문제가 있었으므로 iterrows () 함수를 사용하여 iterrows에 대한 Pandas 데이터 세트 Pandas 설명서를 반복해야합니다.
data = pd.read_csv('foo.csv')
for index,item in data.iterrows():
print('{} {}'.format(item["gravatar_id"], item["position"]))
함수에 의해 반환되는 데이터 집합의 인덱스를 처리해야합니다.