2014-02-22 4 views
3

MRJob을 사용하여 아주 기본적인 단어 수를 구현하려고합니다. 모든 아스키 입력으로 잘 작동하지만 내가 입력에 키릴 단어를 혼합 할 때, 나는 출력으로 같은 것을 얻을python map 키릴 문자로 간단한 단어 수를 줄입니다.

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

는 지금까지 내가 이해, 위의 첫 번째 행은 키릴 단어의 인코딩 된 하나의 사건이다 "мир", 내 샘플 입력 텍스트와 관련하여 올바른 결과입니다. 여기에 MR 코드가 있습니다

저는 Windows에서 Python 2.7 및 mrjob 0.4.2를 사용하고 있습니다. 제 질문은 :

) 정확하게 을 읽을 수 있습니까? 키릴 문자 입력시 키릴 문자 출력을 어떻게 할 수 있습니까? b)이 동작의 근본 원인은 무엇입니까 - 파이썬/MR 버전 또는 비 Windows에서 다르게 작동 할 것으로 예상 되었습니까 - 단서가 있습니까?

내가

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

컴퓨터에서 명령의 결과는 무엇입니까?'python -c "print 'мир', u'мир '"'? – jfs

+0

UnicodeEncodeError : 'charmap'코덱이 0-2 위치의 문자를 인코딩 할 수 없습니다. 문자는 Anton

+0

으로 매핑됩니다. 유니 코드 이스케이프를 사용하여 유니 코드 리터럴을 작성하려고 시도하십시오. 'python -c'print 'мир', u '\ u043c \ u0438 \ u0440 '' '. 또한 오류가 발생하면 'PYTHONIOENCODING' envvar를 콘솔에서 사용하는 문자 인코딩 (예 :'cp1251' 또는'cp866')으로 설정하십시오. 아마, 비 ASCII 문자를 파이썬에서 Windows 콘솔로 출력하는 문제를 피하기 위해,'mrjob'은'.encode ('unicode-escape')'를 호출하거나 JSON 텍스트를 입출력 (비슷한 이스케이프를 사용합니다)으로 사용할 수도 있습니다. – jfs

답변

2

파이썬 2.x는 더 판독 가능이를 인쇄하려면 파이썬 -c "인쇄 u'мир '"의 출력을 재현하고있어, 당신은 명시 적으로이 있다는 인터프리터를 알려줄 필요 유니 코드 문자열 :

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

는, 유니 코드 문자열로 문자열을 변환 사용하려면 unicode :

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

감사합니다. 그러나 이것을 감속기에 추가하면 TypeError가 발생합니다 : Unicode가 지원되지 않습니다. ' – Anton

+0

'MRJob '이 지원하지 않으면 후 처리 단계로 추가 할 수 있습니다. – jonrsharpe

+0

그럴 수도 있지만 이것을 피하려고합니다. – Anton

0

콘솔로 인쇄하려면 터미널에서 이해할 수있는 인코딩으로 문자를 인코딩해야합니다. 대부분 UTF-8 일 것입니다 : print u"\u043c\u0438\u0440".encode("utf-8"),하지만 Windows에서는 다른 것을 사용해야 할 수도 있습니다 (cp1251, 아마도?).

+0

감사합니다. 그러나 이것도 콘솔이나 파일 ('--no-output' 옵션으로 출력)에 상관없이 읽을 수있는 키릴 문자 출력을 생성하지 않습니다. – Anton