Search code examples
pythonlistfilekeyerror

How to resolve KeyError: <variable> in Python?


Hi I'm trying to open simple csv file with the header from an external file:

got next file named: name.csv with next content:

Leo,Days,Ju
Tomas,Lee,Bruce
Max,Perez,Smith

If I code:

import csv
sep = ','
with open('name.csv') as csvfile:
     fieldnames = ['name', 'paterno', 'materno']
     reader = csv.DictReader(csvfile,fieldnames)
     for row in reader:
         list = (row['name'], \
                 row['materno'])
         print (sep.join(list))

The result is desired like:

Leo,Ju
Tomas,Bruce
Max,Smith

But if got an extra file with headers named hdr_name.txt with:

['name', 'paterno', 'materno']

With this new code:

import csv
sep = ','
fieldnames =  open('hdr_name.txt', 'r').read()
with open('name.csv') as csvfile:
    print(fieldnames)
    reader = csv.DictReader(csvfile,fieldnames)
    for row in reader:
        list = (row['name'], \
            row['materno'])
        print (sep.join(list))

Got as result:

Traceback (most recent call last):
  File "<stdin>", line 5, in <module>
KeyError: 'name'

But if I ask for 'name' in fieldnames, is there!

>>> 'name' in fieldnames
True
>>> 

What I'm doing wrong, with opening header from external file ?


Solution

  • fieldnames is a string that looks like this:

    "['name', 'paterno', 'materno']"
    

    Naturally, a membership test will return true, but that does not imply fieldnames is a list. Remember, file.read returns a string - you still need to cast it to a list.

    This doesn't appear to look like JSON, so I'd recommend ast:

    import ast
    with open('hdr_name.txt', 'r') as f:
         fieldnames = ast.literal_eval(f.read().strip())