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 コーデックです。getrequest6 ファイルから ANSI ファイルにデータをコピーして貼り付けると、上記のコードが機能するため、これが KeyError の理由であると想定しています。

どんな助けでも大歓迎です。コーデック クラスで検索しましたが、わかりません。

4

2 に答える 2

1

問題がソースcsvファイルにあり、一部の行に「変更」がない場合、できること(これも一般的に良い方法です)は、dictでそのキーが利用可能かどうかを確認することです:

# ...
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 を削除すると、csvutf-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 に答える