我是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文件时,上面的代码可以工作。
任何帮助将不胜感激。我搜索了编解码器类,但我不明白。
答案 0 :(得分:1)
如果问题出在源csv文件中,某些行只是缺少“更改”,那么你可以做的(一般来说也是一个好习惯)是检查dict中该键的可用性:
# ...
if 'Change' in line and line['Change'] == ticket_id:
# the rest
答案 1 :(得分:1)
在utf-8中,当列名为“更改”时,它打印第一列:“\ xef \ xbb \ xbfChange”
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)