1

我是 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 文件时,上面的代码可以正常工作。

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

4

2 回答 2

1

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

# ...
if 'Change' in line and line['Change'] == ticket_id:
    # the rest
于 2013-02-27T21:15:51.663 回答
1

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

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)
于 2013-02-27T21:49:39.977 回答