2017-10-04 93 views
0

嗨,我試圖打開簡單的csv文件與外部文件的標題:如何在Python中解決KeyError:<variable>?

了命名一個文件: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 
>>> 

我做錯了,從外部文件打開標題?

+0

剛剛看了你的頭所以'字段名=開放( 'hdr_name.txt', 'R')readlines方法(。 )' – AndMar

+0

@AndMar不幸的是,它不能修復它,因爲該文件包含帶有str'd列表的單行。 –

+0

是的,這是真的( – AndMar

回答

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

好的。找到其他多種方法來執行它,一旦我得到了主要想法!謝謝@COLDSPEED 'fieldnames = eval(open('hdr_name.txt','r')。read())' 使用'eval()' –

+0

@IsraelDiaz試着留下與eval相比,這是不安全的,與ast相比並不安全 –

+0

@COLDSPEED - Oky。got it!10xs! –