2011-05-20 17 views
81

Estoy jugando con Python y tratando de obtener problemas de github en una forma legible. Utilizando el asesoramiento sobre How can I convert JSON to CSV? me ocurrió esto:¿Por qué veo "TypeError: los índices de cadena deben ser enteros"?

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 de GitHub. Cuando intento 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 

¿Qué me falta aquí? ¿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 Tweak La declaración for simplemente

for item in data: 
    print item 

lo que se obtiene es ... "problemas" - por lo que estoy haciendo algo mal más básico. 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 se está munged realmente extraño:

{u'issues': [{u'body': u'Add missing paging (Older>>) lin... 
+0

Lo que hace falta es 'print repr (data)' o 'import pprint; pprint.pprint (data) ' –

+0

@IbrahimApachi Pregunta incorrecta. :) – Amanda

Respuesta

45

item es más probable una cadena en su código; los índices de cadena son los que están entre corchetes, por ejemplo, gravatar_id. Así que primero verificaría su variable data para ver lo que recibió allí; Supongo que data es una lista de cadenas (o al menos una lista que contiene al menos una cadena) mientras que debería ser una lista de diccionarios.

75

La variable item es una cadena. Un índice es el siguiente:

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

El ejemplo anterior utiliza el índice de la cadena 0 para referirse al primer carácter.

Las cadenas no pueden tener índices de cadenas (como los diccionarios). Así que esto no funcionará:

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

data es un objeto dict. Así, iterar sobre esta manera:

Python 2

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

Python 3

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

Esto puede suceder si un común no se encuentra. 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.

Cuestiones relacionadas