字计数器不会打印外来字符

时间:2012-11-11 07:06:16

标签: python word-count

如何设置它来打印中文和重音字符?

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)

1 个答案:

答案 0 :(得分:3)

为了正确处理中文字符,我使用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

>>> 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的{​​{1}}方法类是字符串的__str__方法,因此您总会看到类似__repr__的内容,而不是真正的字符:

\u40ed

在python3中,所有字符串都是unicode,“不”的>>> Counter(u'不') Counter({u'\u4e0d': 1}) >>> repr(u'不') "u'\\u4e0d'" 是“'不'”:

repr

因此,如果你想要一个适用于python2和python3的解决方案,你应该创建一个函数>>> Counter('不') Counter({'不': 1}) >>> repr('不') "'不'" ,在python3中只返回str_counter str,而在python2中它必须迭代键和值对并构建字符串表示形式:

Counter