如何解决KeyError:<;变量>;用Python?

如何解决KeyError:<;变量>;用Python?,python,list,file,keyerror,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(csv

您好,我正在尝试从外部文件打开标题为的简单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\u 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'

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

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

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

只需读取您的头文件,以便
fieldnames=open('hdr_name.txt','r')。readlines()
@AndMar,很遗憾,该文件包含一行str'd列表。是的,这是真的(更重要的是,停止将对象的字符串表示形式转储到txt文件并将其称为序列化-使用预先存在的序列化格式。只需读取标题,以便
fieldnames=open('hdr_name.txt','r')。readlines()
@AndMar,很遗憾,它没有修复它,因为该文件包含一行str'd列表。是的,确实如此(更重要的是,停止将对象的字符串表示形式转储到txt文件并将其称为序列化-使用预先存在的序列化格式。好的。一旦我了解了主要思想,就找到了多种方法中的其他方法!感谢@COLDSPEED
fieldnames=eval(open('hdr_name.txt','r')。read()
使用
eval()
@IsraelDiaz尽量远离eval,它与ast相比是不安全的。@COLDSPEED-Oky.明白了!10xs!更多信息:来自文档状态:
请参阅ast.literal\u eval(),了解一个函数,该函数可以使用只包含文字的表达式安全地计算字符串。
[]好的。一旦我了解了要点,我就找到了其他多种方法!谢谢@COLDSPEED
fieldnames=eval(open('hdr_name.txt','r').read())
使用
eval()
@IsraelDiaz尽量远离eval,它与ast相比是不安全的。@COLDSPEED-Oky.明白了!10xs!更多信息:来自文档状态:
请参阅ast.literal\u eval(),了解一个函数,该函数可以使用只包含文字的表达式安全地计算字符串。
[]