中国語とアクセント付きの文字を印刷するように設定するにはどうすればよいですか?
from twill.commands import *
from collections import Counter
with open('names.txt') as inf:
words = (line.strip() for line in inf)
freqs = Counter(words)
print (freqs)
中国語とアクセント付きの文字を印刷するように設定するにはどうすればよいですか?
from twill.commands import *
from collections import Counter
with open('names.txt') as inf:
words = (line.strip() for line in inf)
freqs = Counter(words)
print (freqs)
漢字を正しく処理するcodecs.open
には、プレーンの代わりに使用open
し、ファイルに適切なエンコーディングを渡します。
たとえば、文字列「aèioሴሴ」を含むファイル「unicode.txt」がある場合:
>>> open('unicode.txt').read() # has utf-8 BOM
'\xef\xbb\xbfa\xc3\xa8io\xe1\x88\xb4 \xe1\x88\xb4'
>>> codecs.open('unicode.txt').read() #without encoding is the same as open
'\xef\xbb\xbfa\xc3\xa8io\xe1\x88\xb4 \xe1\x88\xb4'
>>> codecs.open('unicode.txt', encoding='utf-8').read()
u'\ufeffa\xe8io\u1234 \u1234'
そして、Counter
あなたが得るsのために:
>>> Counter(open('unicode.txt').read())
Counter({'\xe1': 2, '\x88': 2, '\xb4': 2, 'a': 1, '\xc3': 1, ' ': 1, 'i': 1, '\xa8': 1, '\xef': 1, 'o': 1, '\xbb': 1, '\xbf': 1})
>>> Counter(codecs.open('unicode.txt', encoding='utf-8').read())
Counter({u'\u1234': 2, u'a': 1, u' ': 1, u'i': 1, u'\xe8': 1, u'o': 1, u'\ufeff': 1})
「漢字を印刷するように設定するにはどうすればprint(freqs)
よいですか」の場合、は のように表示されるはずですがCounter({'不': 1})
、これはpython2では不可能ですが、python3ではデフォルトです。
python2では、Counter
の__str__
メソッドクラスは文字列のメソッドであるため、実際の文字の代わりに次の__repr__
ようなものが常に表示されます。\u40ed
>>> Counter(u'不')
Counter({u'\u4e0d': 1})
>>> repr(u'不')
"u'\\u4e0d'"
python3では、すべての文字列はユニコードであり、repr
「不」のは「不」です。
>>> Counter('不')
Counter({'不': 1})
>>> repr('不')
"'不'"
したがって、python2とpython3の両方で機能するソリューションが必要な場合は、python3ではのを返す関数を作成する必要がありますが、str_counter
python2では、キーと値のペアを反復処理して文字列表現自体を構築する必要があります。str
Counter
>>> def str_counter(counter):
... if sys.version_info.major > 2:
... # python3, no need to do anything
... return str(counter)
... # python2: we manually create a unicode representation.
... result = u'{%s}'
... parts = [u'%s: %s' % (unicode(key), unicode(value)) for key, value in counter.items()]
... return result % u', '.join(parts)
...
>>> print str_counter(Counter(u'不')) # python2
{不: 1}