python - loads - ¿Por qué veo "TypeError: los índices de cadena deben ser enteros"?
simple json python (4)
Estoy jugando con Python y tratando de obtener problemas de Github en una forma legible. Usando el consejo sobre ¿Cómo puedo convertir JSON a CSV? Se me ocurrió esto:
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"]])
Donde "issues.json" es el archivo json que contiene mis problemas github. Cuando trato de ejecutar eso, obtengo
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
¿Que me estoy perdiendo aqui? ¿Cuáles son los "índices de cuerda"? Estoy seguro de que una vez que tenga esto en funcionamiento tendré más problemas, pero por ahora, ¡me encantaría que esto funcione!
ACTUALIZACIÓN: cuando modifico la declaración para simplemente
for item in data:
print item
lo que obtengo es ... "problemas" - entonces estoy haciendo algo más básico mal. Aquí hay un poco de mi 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...
cuando imprimo data
, parece que está siendo manoseado realmente de manera extraña:
{u''issues'': [{u''body'': u''Add missing paging (Older>>) lin...
El item
variable es una cadena. Un índice se ve así:
>>> mystring = ''helloworld''
>>> print mystring[0]
''h''
El ejemplo anterior usa el índice 0
de la cadena para referirse al primer carácter.
Las cadenas no pueden tener índices de cadenas (como los diccionarios). Entonces esto no funcionará
>>> mystring = ''helloworld''
>>> print mystring[''stringindex'']
TypeError: string indices must be integers
Esto puede suceder si falta un elemento común. Me encontré con él cuando tenía una lista de dos tuplas, cada una de las cuales constaba de una cuerda en la primera posición y una lista en la segunda. De forma errónea, omití la coma después del primer componente de una tupla en un caso, y el intérprete pensó que estaba intentando indexar el primer componente.
data
son un objeto dict
. Por lo tanto, repítelo de esta manera:
Python 2
for key, value in data.iteritems():
print key, value
Python 3
for key, value in data.items():
print(key, value)
item
es muy probablemente una cadena en su código; los índices de cadena son los que figuran entre corchetes, por ejemplo, gravatar_id
. Así que primero verifico su variable de data
para ver lo que recibió allí; Supongo que los data
son una lista de cadenas (o al menos una lista que contiene al menos una cadena), mientras que debería ser una lista de diccionarios.