python - 恢复字符串中的 UTF-8 编码

标签 python string python-2.7 utf-8 ascii

我正在使用 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/

相关文章:

iOS 将字符串传递给另一个应用程序

string - 如何在Lua中计算文本文件中的单词数量

python - 在Python中,我们如何将某个变量的先前值存储在另一个变量中?

python-2.7 - jinja2 内置过滤器中的基本名称或目录名称?

python - XlsxWriter write_formula 带日期

python - 将多个正则表达式与单个列匹配(并将匹配结果制成表格)

python - OpenCV TypeError : contour is not a numpy array, 既不是标量

java - 使用 Java 将 NAMES TYPED IN CAPITALS 列表更改为 Names Typed In Capitals with Java

python - Python中flash元素的截图

python - 我可以使用 ctypes 从 C 中嵌入的 python 回调 C 函数吗?