簡體   English   中英

恢復字符串中的UTF-8編碼

[英]Recover UTF-8 encoding in string

我正在使用python腳本從.csv文件中提取多個字符串,但是在打開文件並讀取各行后,我無法恢復西班牙語字符(如á,é,í)。 到目前為止,這是我的代碼:

import csv
list_text=[]

with open(file, 'rb') as data:
    reader = csv.reader(data, delimiter='\t')
    for row in reader:
        print row[0]
        list_text.extend(row[0])
        print list_text

我得到這樣的東西:

'Vivió el sueño, ESPAÑOL...'  ['Vivi\xc3\xb3 el sue\xc3\xb1o, ESPA\xc3\x91OL...']

我不知道為什么它以正確的格式打印,但是當我將其附加到列表中時是不正確的。

編輯:問題是我需要恢復字符,因為在讀取文件后,列表中包含成千上萬個單詞,不需要打印,我需要使用正則表達式來消除標點符號,但是這也會刪除反斜杠,並且單詞不完整。

當您打印列表時,它將顯示所有已取消的字符,這樣\\n和其他字符不會脫離列表顯示,因此,如果您打印字符串,它將可以正常工作:

'Vivi\xc3\xb3 el sue\xc3\xb1o, ESPA\xc3\x91OL...'.decode('utf-8')

python 2.x csv模塊不支持unicode,通過以二進制模式打開文件並解析utf-8編碼的字符串而不是解碼的unicode字符串,您做了正確的事情。 Python 2有點奇怪,因為str類型(與unicode類型相反)保存字符串或二進制數據。 您得到了'Vivi\\xc3\\xb3 el sue\\xc3\\xb1o, ESPA\\xc3\\x91OL...' ,這是unicode的二進制utf-8編碼。

我們可以對其進行解碼以獲得unicode版本...

>>> encoded_text = 'Vivi\xc3\xb3 el sue\xc3\xb1o, ESPA\xc3\x91OL...'
>>> text = encoded_text.decode('utf-8')
>>> print repr(text)
u'Vivi\xf3 el sue\xf1o, ESPA\xd1OL...'
>>> print text
Vivió el sueño, ESPAÑOL...

...但是請稍等,編碼后的文本將打印出相同的文字

>>> print encoded_text
Vivió el sueño, ESPAÑOL...

那是怎么回事? 這與utf-8編碼終端的顯示表面有關。 在第一種情況下( print text ), text是一個unicode字符串,因此python必須先對其進行編碼,然后才能將其發送到查看utf-8編碼版本的終端。 在第二種情況下,它只是一個常規字符串,而python發送了它而沒有進行轉換...但是恰好發生了,它保存了終端解碼后的編碼文本。

最后,當字符串在列表中時,python打印其repr表示形式,而不是其str值,如

>>> print repr(encoded_text)
'Vivi\xc3\xb3 el sue\xc3\xb1o, ESPA\xc3\x91OL...'

為了正確起見,請在完成csv模塊處理后將行中的單元格轉換為unicode。

import csv
list_text=[]

with open(file, 'rb') as data:
    reader = csv.reader(data, delimiter='\t')
    for row in reader:
        row = [cell.decode('utf-8') for cell in row]
        print row[0]
        list_text.extend(row[0])
        print list_text
  1. 使用unicodecsv而不是csv,csv不支持很好的unicode

  2. 使用編解碼器和“ utf-8”打開文件

見下面的代碼

import unicodecsv as csv
import codecs 
list_text=[]

with codecs.open(file, 'rb','utf-8') as data:
    reader = csv.reader(data, delimiter='\t')
    for row in reader:
        print row[0]
        list_text.extend(row[0])
        print list_text

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM