Home > Back-end >  Looping through list of dicts and appending to csv file - index error
Looping through list of dicts and appending to csv file - index error

Time:11-27

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

CodePudding user response:

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)

CodePudding user response:

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)
  • Related