次のコードを使用して、CSVをインポートしようとしています。
import csv
import sys
def load_csv(filename):
# Open file for reading
file = open(filename, 'r')
# Read in file
return csv.reader(file, delimiter=',', quotechar='\n')
def main(argv):
csv_file = load_csv("myfile.csv")
for item in csv_file:
print(item)
if __name__ == "__main__":
main(sys.argv[1:])
これが私のcsvファイルのサンプルです:
foo,bar,test,1,2
this,wont,work,because,α
そしてエラー:
Traceback (most recent call last):
File "test.py", line 22, in <module>
main(sys.argv[1:])
File "test.py", line 18, in main
for item in csv_file:
File "/usr/lib/python3.2/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 40: ordinal not in range(128)
明らかに、CSVの最後で文字をヒットしてそのエラーをスローしていますが、これを修正する方法がわかりません。何か助けはありますか?
これは:
Python 3.2.3 (default, Apr 23 2012, 23:35:30)
[GCC 4.7.0 20120414 (prerelease)] on linux2
あなたの問題は次のように要約されているようです:
_print("α")
_
PYTHONIOENCODING
:を指定することで修正できます。
_$ PYTHONIOENCODING=utf-8 python3 test.py > output.txt
_
注意:
_$ python3 test.py
_
端末構成でサポートされている場合は、そのまま機能するはずです。ここで、_test.py
_:
_import csv
with open('myfile.csv', newline='', encoding='utf-8') as file:
for row in csv.reader(file):
print(row)
_
open()
に上記のencoding
パラメータがない場合、_LC_ALL=C
_でUnicodeDecodeError
を取得します。
また、_LC_ALL=C
_を使用すると、リダイレクトがない場合でもUnicodeEncodeError
を取得できます。つまり、この場合はPYTHONIOENCODING
が必要です。
python docs から、ファイルのエンコーディングを設定する必要があります。これがサイトからの例です:
import csv
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
print(row)
編集:あなたの問題は印刷で起こっているようです。プリティプリンターを使用してみてください:
import csv
import pprint
with open('some.csv', newline='', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
pprint.pprint(row)
別のオプションは、エラーハンドラーを渡すことによってエラーを隠すことです。
with open('some.csv', newline='', errors='replace') as f:
reader = csv.reader(f)
for row in reader:
print(row)
これにより、ファイル内のデコードできないバイトが「欠落している文字」に置き換えられます。