解码中文停用词文件并附加到列表中

时间:2015-07-22 21:16:13

标签: python encoding utf-8 decode

我正在尝试阅读中文停用词文件并将字符附加到列表中。这是我的代码:

word_list=[]
with open("stop-words_chinese_1_zh.txt", "r") as f:
    for row in f:
        decoded=row.decode("utf-8")
        print decoded
        word_list.append(decoded)
print word_list[:10]

这是我的输出。解码看起来很好,但在我将解码附加到列表后,它会恢复为未解码的字符。

着

诸

自
[u'\u7684\r\n', u'\u4e00\r\n', u'\u4e0d\r\n', u'\u5728\r\n', u'\u4eba\r\n', u'\u6709\r\n', u'\u662f\r\n', u'\u4e3a\r\n', u'\u4ee5\r\n', u'\u4e8e\r\n']

1 个答案:

答案 0 :(得分:1)

该列表尚未恢复为未解码的字符。如果在列表中打印元素的类型:

>>> print type(word_list[0])

你得到:

<type 'unicode'>

所以你的清单没有任何问题。现在我们将注意力转向打印功能。当您在对象上调用print时,它会打印该对象 str 函数返回的任何内容。但是,对于列表,它的 str 函数会在每个元素上迭代地调用 repr ,这会返回所述元素的Python表示字符串。

此处您需要的行为是在列表中的每个元素上调用 str 而不是 repr 。这里有一个警告: str 将尝试使用&#39; ascii&#39;来编码给定对象。编码,由于列表元素是unicode,因此总是会失败。为了在屏幕上显示,你可能想要sys.stdout.encoding,它通常是&#39; UTF-8&#39;。

因此,要在屏幕上打印一个unicode列表:

>>> import sys
>>> print '[' + ','.join(w.encode(sys.stdout.encoding) for w in word_list) + ']'

或者,我们可以传入一个unicode字符串,让print处理屏幕编码:

>>> print u'[' + u','.join(word_list) + u']'

最后一件事:你的word_list中的元素似乎也包含换行符。您可能想要省略它们,因为您正在构建一个停用词列表。你的最终解决方案是:

>>> print u'[' + u','.join(w[0] for w in word_list) + u']'