Estoy jugando con Python aprendiendo 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 de github. Cuando trato de ejecutar eso, me sale
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 cadena"? Estoy seguro de que una vez que funcione, tendré más problemas, pero por ahora, ¡me encantaría que esto funcione!
Cuando modifico la for
declaración simplemente
for item in data:
print item
lo que obtengo es ... "problemas", así que 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 data
imprimo parece que se está machacando realmente extraño:
{u'issues': [{u'body': u'Add missing paging (Older>>) lin...
print repr(data)
oimport pprint; pprint.pprint(data)
Respuestas:
item
es muy probable que sea una cadena en su código; los índices de cuerdas son las de los corchetes, por ejemplo,gravatar_id
. Así que primero verificaría tudata
variable para ver qué recibiste allí; Supongo quedata
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.fuente
La variable
item
es una cadena. Un índice se ve así:El ejemplo anterior usa el
0
índice de la cadena para referirse al primer carácter.Las cadenas no pueden tener índices de cadena (como los diccionarios pueden). Entonces esto no funcionará:
fuente
data
Es undict
objeto. Entonces, repítelo así:Python 2
Python 3
fuente
TypeError para la notación de corte
str[a:b]
tl; dr: use dos puntos en
:
lugar de una coma entre los dos índicesa
yb
enstr[a:b]
Cuando se trabaja con cadenas y notación de corte (una operación de secuencia común ), puede suceder que
TypeError
se levante a, señalando que los índices deben ser enteros, incluso si obviamente lo son.Ejemplo
Obviamente pasamos dos enteros para los índices a la notación de corte, ¿verdad? Entonces, ¿cuál es el problema aquí?
Este error puede ser muy frustrante, especialmente al comienzo del aprendizaje de Python, porque el mensaje de error es un poco engañoso.
Explicación
Implícitamente pasamos una tupla de dos enteros (0 y 5) a la notación de corte cuando llamamos
my_string[0,5]
porque0,5
(incluso sin los paréntesis) se evalúa a la misma tupla como(0,5)
lo haría.Una coma
,
es en realidad suficiente para que Python evalúe algo como una tupla:Entonces, lo que hicimos allí, esta vez explícitamente:
Ahora, al menos, el mensaje de error tiene sentido.
Solución
Necesitamos reemplazar la coma
,
con dos puntos:
para separar los dos enteros correctamente:Un mensaje de error más claro y útil podría haber sido algo como:
Un buen mensaje de error muestra al usuario directamente lo que hizo mal y hubiera sido más obvio cómo resolver el problema.
[Entonces, la próxima vez que te encuentres responsable de escribir un mensaje de descripción de error, piensa en este ejemplo y agrega la razón u otra información útil al mensaje de error para que tú y otras personas entiendan lo que salió mal.]
Lecciones aprendidas
:
para separar sus índices (y rango de pasos, por ejemplostr[from:to:step]
),
(pt = 1,
. ej. )Saludos y feliz programación
winklerrr
[Sé que esta pregunta ya fue respondida y esta no fue exactamente la pregunta que hizo el iniciador del hilo, pero vine aquí debido al problema anterior que conduce al mismo mensaje de error. Al menos me llevó bastante tiempo encontrar ese pequeño error tipográfico.
Así que espero que esto ayude a alguien que se topó con el mismo error y les ahorre algo de tiempo para encontrar ese pequeño error.]
fuente
Esto puede suceder si falta una coma. Me encontré con él cuando tenía una lista de dos tuplas, cada una de las cuales consistía en una cadena en la primera posición, y una lista en la segunda. Por error, omití la coma después del primer componente de una tupla en un caso, y el intérprete pensó que estaba tratando de indexar el primer componente.
fuente
Tuve un problema similar con Pandas, debe usar la función iterrows () para iterar a través de un conjunto de datos de Pandas Documentación de Pandas para iterrows
tenga en cuenta que debe manejar el índice en el conjunto de datos que también devuelve la función.
fuente