我正在尝试使用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>
答案 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
,也许?)。