【问题标题】:How to resolve KeyError: <variable> in Python?如何解决 Python 中的 KeyError: <variable>?
【发布时间】:2017-10-04 21:49:07
【问题描述】:

您好,我正在尝试打开带有外部文件标头的简单 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' in fieldnames
True
>>> 

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

【问题讨论】:

  • 只需阅读您的标题fieldnames = open('hdr_name.txt', 'r').readlines()
  • @AndMar 不幸的是,这并没有解决它,因为该文件包含一个带有 str'd 列表的单行。
  • 是的,没错(
  • 更重要的是,停止将对象的字符串表示形式转储到 txt 文件并称之为序列化 - 使用预先存在的序列化格式

标签: python list file keyerror


【解决方案1】:

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

【讨论】:

  • 好的。一旦我得到了主要想法,就找到了多种方法中的其他方法!谢谢@COLDSPEED fieldnames = eval(open('hdr_name.txt', 'r').read()) 使用eval()
  • @IsraelDiaz 尽量远离 eval,它与 ast 相比是不安全的。
  • @COLDSPEED - 好的。知道了! 10 倍!
  • 有关它的更多信息:来自文档状态:See ast.literal_eval() for a function that can safely evaluate strings with expressions containing only literals. [docs.python.org/2/library/functions.html?highlight=eval#eval]
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2022-01-03
相关资源
最近更新 更多