繁体   English   中英

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

[英]python map reduce simple wordcount in cyrillic text

我正在尝试用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>

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM