Looping through list of dicts and appending to csv file - index error

I'm trying to loop through list of dicts and append values to a csv file by looping through the list index then looping through dicts but i get a index erorr:

import csv
data=json_resp.json()

with open('Meteroits.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]
            i_d=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':i_d,'nametype':nametype,'recclass':recclass,'mass':mass,'fall':fall,'year':year,'reclat':reclat,'reclong':reclong,'geolocation':geolocation})

I'm getting the error at index NO.4: ---> 12 recclass=x[4] IndexError: string index out of range

And here's a sample of data:

{'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'}}

2 answers

  • answered 2021-11-27 11:51 azro

    The problem is

    • i is one index
    • data[i] is one item, a dict
    • x is a key of the data[i] dict, the first one being 'name'
    • x[1] is the letter n, ... x[3] the letter 'e', so x[4] is out of range

    Just write the dict as you have it already

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

    Or just use pandas

    import pandas as pd
    
    df = pd.DataFrame(data)
    df.to_csv('Meteroits.csv', index=False)
    

  • answered 2021-11-27 11:52 Igor Moraru

    The error is that x is the key of the dict, and not the dict itself. It should be:

    for i in range(len(data)):
        new_dict = {}
        for x, val in data[i].items():
            new_dict[x] = val
        writer.writerow(new_dict)
    

How many English words
do you know?
Test your English vocabulary size, and measure
how many words do you know
Online Test
Powered by Examplum