KeyError,与ANSI vs UTF-8编解码器有关?

时间:2013-02-27 21:07:42

标签: python python-2.7

我是python 编程的新手,所以我确信我的代码与'pythonic'相反。

我的目标是从服务器获取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文件时,上面的代码可以工作。

任何帮助将不胜感激。我搜索了编解码器类,但我不明白。

2 个答案:

答案 0 :(得分:1)

如果问题出在源csv文件中,某些行只是缺少“更改”,那么你可以做的(一般来说也是一个好习惯)是检查dict中该键的可用性:

# ...
if 'Change' in line and line['Change'] == ticket_id:
    # the rest

答案 1 :(得分:1)

  

当列名为“更改”时,它打印第一列:“\ xef \ xbb \ xbfChange”

在utf-8中,

b"\xef\xbb\xbf"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)