我正在使用 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...']
我不知道为什么它以正确的形式打印它,但是当我将它附加到列表时却不正确。
编辑: 问题是我需要恢复字符,因为在我读取文件后,列表中有数千个单词,我不需要打印它我需要使用正则表达式来删除标点符号,但这也删除反斜杠,单词不完整。
最佳答案
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
关于python - 恢复字符串中的 UTF-8 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43222378/