[英]Reading UTF8 encoded CSV and converting to UTF-16
我正在讀取具有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()
相對)時,輸出顯示ok(無論如何我都不明白-這是否會導致錯誤?):
> Á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'
因此,現在我完全感到困惑,因為這些值似乎是錯誤的十六進制值。 我讀過這個問題:
看來我做得一切正確,使我相信我的文件實際上不是UTF8,但是當我最初打印出單元格的repr
值時,它們似乎可以糾正UTF8十六進制值。 任何人都可以指出我的問題或指出我的理解在哪里破裂(因為我開始迷失在編碼的叢林中)
順便說一句,我相信我可以使用codecs
打開文件並將其直接讀取到unicode對象中,但是csv
模塊本身不支持unicode,因此我可以使用這種方法。
您的默認編碼是ASCII。 因此,當您嘗試打印unicode
對象時,解釋器將嘗試使用ASCII編解碼器對其進行編碼,這會失敗,因為您的文本包含了ASCII中不存在的字符。
打印UTF-8編碼的字節串不會產生錯誤的原因(這似乎會讓您感到困惑,盡管應該不會),原因是這只是將字節發送到您的終端。 盡管您的終端不知道如何處理字節,但是它永遠不會產生Python錯誤,盡管它可能會產生難看的輸出。
要打印unicode,請使用print some_unicode.encode('utf-8')
。 (或您的終端實際使用的任何編碼)。
至於u'\\xc1lvaro Salazar'
,這里什么也沒弄亂。 字符
Á
位於Unicode代碼點C1(與UTF-8表示形式無關,但恰好與Latin-1中的值相同),Python使用\\x
十六進制轉義符代替\\u\u003c/code> Unicode代碼點表示法對於將00作為最高有效字節以節省空間的代碼點(它也可能顯示為
\Á
。
為了全面了解Unicode在Python中的工作方式,我建議http://nedbatchelder.com/text/unipain.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.