3

この問題については、ウェブ上で多くのトピックがありますが、私の特定のケースに対する答えが見つからないようです。

私はCSVファイルを持っています。何が行われたかはわかりませんが、開こうとすると、次のようになります。

UnicodeDecodeError: 'utf8' コーデックは位置 0 のバイト 0xff をデコードできません: 無効な開始バイト

ここに完全がありTracebackます:

Traceback (most recent call last):
  File "keywords.py", line 31, in <module>
    main()
  File "keywords.py", line 28, in main
    get_csv(file_full_path)
  File "keywords.py", line 19, in get_csv
    for row in reader:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u5a07' in position 10:    ordinal    not in range(128)

Stack Overflow の助けを借りて、次のように開きました。

reader = csv.reader(codecs.open(file_full_path, 'rU', 'UTF-16'), delimiter='\t', quotechar='"')

今問題は、私がファイルを読んでいるときです:

def get_csv(file_full_path):
    import csv, codecs
    reader = csv.reader(codecs.open(file_full_path, 'rU', 'UTF-16'), delimiter='\t', quotechar='"')
    for row in reader:
        print row

私はアジアのシンボルで立ち往生しています:

UnicodeEncodeError: 'ascii' コーデックは位置 10 の文字 u'\u5a07' をエンコードできません: 序数が範囲外です(128)

decodeその文字を含む文字列に対して 'encode'を試みunicode()ましたが、役に立たないようです。

for row in reader:
    #decoded_row = [element_s.decode('UTF-8') for element_s in row]
    #print decoded_row
    encoded_row = [element_s.encode('UTF-8') for element_s in row]
    print encoded_row

この時点で、その理由がよくわかりません。もし私が

>>> print u'\u5a07'
娇

また

>>> print '娇'
娇

できます。ターミナルでも動作します。ターミナルと Python シェルのデフォルトのエンコーディングを確認しました。どこでも UTF-8 です。そして、そのシンボルを簡単に印刷します。codecsUTF-16を使用してファイルを開くことに関係があると思います。

ここからどこへ行けばいいのかわからない。誰か助けてくれませんか?

4

2 に答える 2

5

csvモジュールはUnicode入力を処理できません。それはそのドキュメントページで具体的にそう言っています:

注:このバージョンのcsvモジュールは、Unicode入力をサポートしていません。また、現在、ASCIINUL文字に関していくつかの問題があります。したがって、安全のために、すべての入力はUTF-8または印刷可能なASCIIである必要があります。

モジュールが処理できるように、CSVファイルをUTF-8に変換する必要があります。

with codecs.open(file_full_path, 'rU', 'UTF-16') as infile:
    with open(file_full_path + '.utf8', 'wb') as outfile:
        for line in infile:
            outfile.write(line.encode('utf8'))

または、コマンドラインユーティリティiconvを使用してファイルを変換することもできます。

次に、その再コード化されたファイルを使用してデータを読み取ります。

 reader = csv.reader(open(file_full_path + '.utf8', 'rb'), delimiter='\t', quotechar='"')
 for row in reader:
     print [c.decode('utf8') for c in row]

次に、列を手動でユニコード化するためにデコードする必要があることに注意してください。

于 2012-12-14T09:22:27.400 に答える
-1

Unicode 文字を 8 ビット シーケンスに変換しようとすると、エンコード エラーが発生します。したがって、最初のエラーは、実際にファイルを読み取ったときに取得されるエラーではなく、少し後で発生します。

おそらくこのエラーが発生するのは、Python 2 CSV モジュールがファイルを開いたときにファイルがバイナリ モードであることを想定しているため、Unicode 文字列が返されるためです。

オープニングを次のように変更します。

reader = csv.reader(open(file_full_path, 'rb'), delimiter='\t', quotechar='"')

そして、あなたは大丈夫なはずです。またはさらに良い:

with open(file_full_path, 'rb') as infile:
    reader = csv.reader(infile, delimiter='\t', quotechar='"')
    # CVS handling here.

ただし、UTF-16(またはUTF-32)では区切り文字が全角文字で正しく扱えないためUTF-16(またはUTF-32)は使えないのでUTF-8に変換する必要があります。最初。

于 2012-12-14T09:21:29.043 に答える