es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Bucle a través de una lista de diccionarios y agregando a un archivo CSV – error de índice.

Estoy tratando de agregar valores a un archivo csv recorriendo una lista y luego recorriendo los diccionarios de datos json, pero obtengo un error de índice:

import csv
data = json_resp.json()

with open('Meteoritos.csv','w+') as file:
    writer = csv.DictWriter(file, fieldnames=['name','id','nametype','recclass','mass','fall','year','reclat','reclong','geolocation'])
    writer.writeheader()

for i in range(len(data)):
    for x in data[i]:
        name = x[1]
        id = x[2]
        nametype = x[3]
        recclass = x[4]
        mass = x[5]
        fall = x[6]
        year = x[7]
        reclat = x[8]
        reclong = x[9]
        geolocation = x[10]
        writer.writerow({'name':name,'id':id,'nametype':nametype,'recclass':recclass,'mass':mass,'fall':fall,'year':year,'reclat':reclat,'reclong':reclong,'geolocation':geolocation})

Estoy obteniendo el error en el índice 4:

---> 12             recclass=x[4]
IndexError: string index out of range

Y aquí hay un ejemplo de datos:

{
  'name': 'Abee',
  'id': '6',
  'nametype': 'Valid',
  'recclass': 'EH4',
  'mass': '107000',
  'fall': 'Fell',
  'year': '1952-01-01T00:00:00.000',
  'reclat': '54.216670',
  'reclong': '-113.000000',
  'geolocation': {'latitude': '54.21667', 'longitude': '-113.0'}
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con este código es que el bucle intenta acceder a los elementos de cada diccionario dentro de la lista utilizando índices, pero los elementos no están en un orden específico. En su lugar, debe acceder a los elementos por sus claves.

    Para solucionar el problema, reemplace las líneas dentro del bucle for anidado que establecen las variables por las siguientes:

    name=x.get('name')
    i_d=x.get('id')
    nametype=x.get('nametype')
    recclass=x.get('recclass')
    mass=x.get('mass')
    fall=x.get('fall')
    year=x.get('year')
    reclat=x.get('reclat')
    reclong=x.get('reclong')
    geolocation=x.get('geolocation')
    

    Al utilizar el método .get(), Python devolverá el valor de la clave si existe y, si no, devolverá None en lugar de generar un error. Esto permitirá que el bucle continúe ejecutándose incluso si falta una clave en un diccionario.

    Esto debería solucionar el IndexError.

Comments are closed.