UTF8 エンコーディングの CSV ファイルを読み込んでいます。
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
print repr(row[0])
これは問題なく動作し、期待どおりに出力されます。UTF8 でエンコードされたstr
:
> '\xc3\x81lvaro Salazar'
> '\xc3\x89lodie Yung'
...
str
さらに、 (とは対照的に)を単に印刷するとrepr()
、出力は問題なく表示されます(どちらにしてもわかりません-これはエラーを引き起こすべきではありませんか?):
> Álvaro Salazar
> Élodie Yung
しかし、エンコードされたUTF8を次のように変換しようとするstrs
とunicode
:
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
print unicode(name, 'utf-8') # or name.decode('utf-8')
私は悪名高い:
Traceback (most recent call last):
File "scripts/script.py", line 33, in <module>
print unicode(fullname, 'utf-8')
UnicodeEncodeError: 'ascii' codec can't encode character u'\xc1' in position 0: ordinal not in range(128)
そこで、作成された Unicode 文字列を調べました。
ifile = open(fname, "r")
for row in csv.reader(ifile):
name = row[0]
unicode_name = unicode(name, 'utf-8')
print repr(unicode_name)
そして出力は
> u'\xc1lvaro Salazar'
> u'\xc9lodie Yung'
これらは16進数の値が壊れているように見えるので、今は完全に混乱しています。私はこの質問を読みました:
私はすべてを正しく行っているように見え、ファイルが実際には UTF8 ではないと信じるようになりましたが、最初repr
にセルの値を出力すると、UTF8 16 進値が修正されているように見えます。誰かが私の問題を指摘するか、私の理解がどこで壊れているかを示すことができますか (エンコーディングのジャングルで迷子になり始めているため)
余談ですがcodecs
、ファイルを開いて Unicode オブジェクトに直接読み込むために使用できると思いますが、csv
モジュールはネイティブで Unicode をサポートしていないため、このアプローチを使用できます。