如何在Python中解决KeyError:<variable>?

时间:2017-10-04 21:49:07

标签: python list file keyerror

您好我正在尝试使用外部文件中的标头打开简单的csv文件:

下一个名为: name.csv 的文件包含下一个内容:

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

如果我编码:

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

结果如下:

Leo,Ju
Tomas,Bruce
Max,Smith

但如果获得一个名为 hdr_name.txt 标题的额外文件:

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

使用这个新代码:

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

得到结果:

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

但如果我在字段名中要求'name',那就有了!

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

我做错了什么,从外部文件打开标题?

1 个答案:

答案 0 :(得分:2)

fieldnames是一个如下所示的字符串:

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

当然,成员资格测试将返回true,但这并不意味着fieldnames是一个列表。请记住,file.read会返回一个字符串 - 您仍然需要将其强制转换为列表。

这看起来不像JSON,所以我建议ast

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