web-dev-qa-db-ja.com

CSVファイルをインポートするときのPython 3のUnicodeDecodeError

次のコードを使用して、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
15
Ryan Rapini

あなたの問題は次のように要約されているようです:

_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が必要です。

14
jfs

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)
13
TheDude

別のオプションは、エラーハンドラーを渡すことによってエラーを隠すことです。

with open('some.csv', newline='', errors='replace') as f:
   reader = csv.reader(f)
   for row in reader:
    print(row)

これにより、ファイル内のデコードできないバイトが「欠落している文字」に置き換えられます。

0
Ayush Abhijeet