KeyError,与ANSI和UTF-8编码有关?

1 投票
2 回答
1053 浏览
提问于 2025-04-17 17:21

我刚开始学习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

撰写回答