python map减少西里尔文本中的简单wordcount

时间:2014-02-22 14:49:54

标签: python cyrillic mrjob

我正在尝试使用MRJob实现一个非常基本的wordcount示例。使用ascii输入一切正常,但是当我将西里尔字混合到输入中时,我得到类似这样的输出

"\u043c\u0438\u0440"    1
"again!"    1
"hello" 2
"world" 1

据我所知,上面的第一行是单个出现的西里尔字“мир”,这是我的样本输入文本的正确结果。这是MR代码

class MRWordCount(MRJob):

    def mapper(self, key, line):
       line = line.decode('cp1251').strip()
       words = line.split()
       for term in words:
          yield term, 1

    def reducer(self, term, howmany):
        yield term, sum(howmany)

if __name__ == '__main__':
        MRWordCount.run()

我在Windows上使用Python 2.7和mrjob 0.4.2。 我的问题是:

a)如何设法在西里尔输入上正确生成可读西里尔文输出? b)这种行为的根本原因是什么 - 是由于python / MR版本还是预期在非Windows上的工作方式不同 - 任何线索?

我正在复制python -c“printu'мир'”

的输出
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\encodings\cp866.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-2: character maps to <undefined>

2 个答案:

答案 0 :(得分:2)

要在Python 2.x中更可读地打印它,您需要明确告诉解释器它是一个unicode字符串:

>>> print(u"\u043c\u0438\u0440") # note leading u
мир

要将字符串转换为unicode字符串,请使用unicode

>>> print(unicode("\u043c\u0438\u0440", "unicode_escape"))
мир

答案 1 :(得分:0)

要打印到控制台,您需要将字符编码为终端可以理解的编码。大部分时间都是UTF-8:print u"\u043c\u0438\u0440".encode("utf-8"),但在Windows上你可能需要使用另一个(cp1251,也许?)。