Unicode 对象到列表

Unicode object to a list

我有一个 utf8 - 文本语料库,我可以在 Python 2.7 中轻松阅读:

sentence = codecs.open("D:\Documents\files\sentence.txt", "r", encoding="utf8")
sentence = sentence.read()

> This is my sentence in the right format

但是,当我将这个文本语料库传递给列表时(例如,用于标记化):

tokens = sentence.tokenize()

并打印在笔记本上,我得到了类似位的字符,如:

(u'\ufeff\ufeffFaux,', u'Tunisie')
(u'Tunisie', u"l'\xc9gypte,")

而我想要普通字符,就像我最初导入的那样。

所以我的问题是:如何在没有奇怪的 bit/ASCII 字符的情况下将 unicode 对象传递给列表?

Hm, codecs.open(...) returns a "wrapped version of the underlying file object" 然后你用对该对象执行读取方法的结果覆盖这个变量。勇敢,令人恼火 - 但没关系 ;-)

当您在 "notebook" 中输入 äöüß 时,它显示的是 "this" 还是您看到的是 \uxxxxx

codecs.open(...) 的默认值是 errors=strict 所以如果这是所有样本的 相同环境 ,这应该有效。

我明白,当你写 "print it" 时你打印列表,这与打印列表的内容不同。

示例(将 \t 类型的制表符转换为正常的 "byte" 字符串 - 这是 python 2.7.11):

>>> a="\t"
>>> print a  # below is an expanded tab

>>> a
'\t'
>>> [a]
['\t']
>>> print [a]
['\t']
>>> for element in [a]:
...     print element
... 

>>> # above is an expanded tab

全在于你print。 Python 2 显示使用纯 ASCII 字符并用反斜杠转义码代替非 ASCII 字符的列表。这是为了便于查看隐藏的字符,而普通打印会使这些字符不可见,例如您在字符串中看到的双字节顺序标记 (BOM) \ufeff。打印单个字符串项目将正确显示它们。

很多例子

原始字符串:

>>> s = (u'\ufeff\ufeffFaux,', u'Tunisie')
>>> t = (u'Tunisie', u"l'\xc9gypte,")

在交互式提示中显示:

>>> s
(u'\ufeff\ufeffFaux,', u'Tunisie')
>>> t
(u'Tunisie', u"l'\xc9gypte,")
>>> print s
(u'\ufeff\ufeffFaux,', u'Tunisie')
>>> print t
(u'Tunisie', u"l'\xc9gypte,")

从元组打印单个字符串:

>>> print s[0]
Faux,
>>> print s[1]
Tunisie
>>> print t[0]
Tunisie
>>> print t[1]
l'Égypte,
>>> print ' '.join(s)
Faux, Tunisie
>>> print ' '.join(t)
Tunisie l'Égypte,

一种不用转义码打印元组的方法:

>>> print "('"+"', '".join(s)+"')"
('Faux,', 'Tunisie')
>>> print "('"+"', '".join(t)+"')"
('Tunisie', 'l'Égypte,')