[英]How to write a wordcount program using Python without using map reduce
[英]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.