How to resolve KeyError: <variable> in Python?
How to resolve KeyError: <variable> in Python?
您好,我正在尝试使用来自外部文件的 header 打开简单的 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 的 header 的额外文件,其中:
['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
>>>
我做错了什么,从外部文件打开 header?
fieldnames
是一个看起来像这样的字符串:
"['name', 'paterno', 'materno']"
自然地,成员资格测试将 return 为真,但这并不意味着 fieldnames
是一个列表。请记住,file.read
return 是一个字符串 - 您仍然需要将其转换为列表。
这看起来不像 JSON,所以我推荐 ast
:
import ast
with open('hdr_name.txt', 'r') as f:
fieldnames = ast.literal_eval(f.read().strip())
您好,我正在尝试使用来自外部文件的 header 打开简单的 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 的 header 的额外文件,其中:
['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
>>>
我做错了什么,从外部文件打开 header?
fieldnames
是一个看起来像这样的字符串:
"['name', 'paterno', 'materno']"
自然地,成员资格测试将 return 为真,但这并不意味着 fieldnames
是一个列表。请记住,file.read
return 是一个字符串 - 您仍然需要将其转换为列表。
这看起来不像 JSON,所以我推荐 ast
:
import ast
with open('hdr_name.txt', 'r') as f:
fieldnames = ast.literal_eval(f.read().strip())