21

これは簡単に修正できるように思えますが、これまでのところ解決策は見つかりませんでした。非ASCII文字を含む単一列のcsvファイルをutf-8で保存し、読み込んでリストに保存したいと考えています。「Unicode Sandwich」の原則に従い、次のファイルを読み取ってデコードしようとしています。

import codecs
import csv

with codecs.open('utf8file.csv', 'rU', encoding='utf-8') as file:
input_file = csv.reader(file, delimiter=",", quotechar='|')
list = []
for row in input_file:
    list.extend(row)

これにより、「codec can't encoding characters in position, ordinal not in range(128)」という恐ろしいエラーが発生します。

また、この回答からソリューションを適応させようとしましたが、同様のエラーが返されます

def unicode_csv_reader(utf8_data, dialect=csv.excel, **kwargs):
    csv_reader = csv.reader(utf8_data, dialect=dialect, **kwargs)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]

filename = 'inputs\encode.csv'
reader = unicode_csv_reader(open(filename))
target_list = []
for field1 in reader:
    target_list.extend(field1)

ドキュメントから採用された非常によく似たソリューションは、同じエラーを返します。

def unicode_csv_reader(utf8_data, dialect=csv.excel):
    csv_reader = csv.reader(utf_8_encoder(utf8_data), dialect)
    for row in csv_reader:
        yield [unicode(cell, 'utf-8') for cell in row]

def utf_8_encoder(unicode_csv_data):
    for line in unicode_csv_data:
    yield line.encode('utf-8')

filename = 'inputs\encode.csv'
reader = unicode_csv_reader(open(filename))
target_list = []
for field1 in reader:
    target_list.extend(field1)

明らかに私は何かが欠けています。この問題に関して私が目にした質問のほとんどは、Python 2.7 より前のものであるように思われるため、ここでの更新が役に立つかもしれません。

4

3 に答える 3

18

最初のスニペットは機能しません。Unicode データを csv リーダーに供給していますが、(文書化されているように) それを処理できません。

2 番目と 3 番目のスニペットは混乱しています。必要なものは次のようなものだけです。

f = open('your_utf8_encoded_file.csv', 'rb')
reader = csv.reader(f)
for utf8_row in reader:
    unicode_row = [x.decode('utf8') for x in utf8_row]
    print unicode_row
于 2012-05-22T22:52:54.123 に答える
12

最初の文字から読み取るのに失敗した場合、BOM がある可能性があります。codecs.open('utf8file.csv', 'rU', encoding='utf-8-sig')ファイルが UTF8 で、先頭に BOM がある場合に使用します。

于 2012-05-22T22:07:39.193 に答える
-2

試してみることをお勧めします:

input_file = csv.reader(open('utf8file.csv', 'r'), delimiter=",", quotechar='|')

また

input_file = csv.reader(open('utf8file.csv', 'rb'), delimiter=",", quotechar='|')

csv はユニコードに対応している必要があり、正常に動作するはずです。

于 2012-05-22T21:40:34.420 に答える