KeyError,与ANSI和UTF-8编码有关?
我刚开始学习Python和编程,所以我知道我的代码可能不太符合“Python风格”。
我的目标是从服务器上获取一个Excel文件,打开它,然后把文件里的数据写到一个新文件里。接下来,我会打开这个新文件,使用dictReader来打印出几个列的数据。最开始,我写了一个脚本,只是打开一个Excel文件并打印出列的数据,这个我做到了。现在我在添加下一步,就是获取文件,写入到本地文件,然后再打开它。
我遇到了一个错误,在发帖之前我已经查了很多资料:
File "request.py", line 20, in <module>
if line['Change'] == ticket_ID:
KeyError: 'Change'
下面是我的代码:
import csv
import sys
import urllib2
data = urllib2.urlopen("URL-HERE")
new_file = open("c:\\file-here", "w")
for fields in data:
new_file.write(fields)
new_file.close()
test_file = 'getrequest6.csv'
csv_file = csv.DictReader(open(test_file, 'r'))
# ticket_ID = sys.argv[1]
ticket_ID = "RMSDB00010243"
for line in csv_file:
if line['Change'] == ticket_ID:
change_col = line['Change']
review_col = line['Review']
phase_col = line['Phase']
print change_col, review_col, phase_col
我发现我手动从服务器下载的文件是ANSI编码的,打开时没有问题。而我创建并写入的新文件(getrequest6)是UTF-8编码的。我猜这就是导致KeyError的原因,因为当我把getrequest6文件里的数据复制粘贴到ANSI文件里时,我的代码就能正常工作了。
如果有人能帮帮我就太好了。我查过codecs类,但我还是不太理解。
2 个回答
1
它打印出第一列的内容是:"\xef\xbb\xbfChange",而这一列的名字是"Change"
b"\xef\xbb\xbf"
是 utf-8 编码中的一种特殊标记,叫做 BOM。
csv 模块并不直接支持读取和写入 Unicode 字符。不过,如果你去掉这个 BOM,那么就可以正常使用 csv
模块来处理 utf-8 编码的数据:
import os
import shutil
from codecs import BOM_UTF8
with open(test_file, 'rb') as file, open(test_file+".utf8", 'wb') as outfile:
chunk = file.read(len(BOM_UTF8))
if chunk != BOM_UTF8: # don't write BOM
outfile.write(chunk)
shutil.copyfileobj(file, outfile)
os.remove(test_file)
os.rename(test_file+".utf8", test_file)
1
如果问题出在源csv文件中,有些行缺少'Change'这个字段,那么你可以做的事情(这也是一种很好的做法)就是检查这个关键字在字典中是否存在:
# ...
if 'Change' in line and line['Change'] == ticket_id:
# the rest