0

我的python2代码(psp):

input = form.getfirst('input')
row = cgi.escape(input)

f = open(filename, 'a')
f.write('"' + row + '",\n')
f.close()

生成这个:

        "python - питон, прорицатель",
        "cobra - кобра, очковая змея",

我尝试用 python3 读取这些数据。python3 的默认代码页是 UTF-8。

“蟒蛇 - питон, прорицатель”,

“眼镜蛇 - кобра, очковая змея”,

我需要计算俄罗斯符号的数量。但计算规范符号的数量:'&'、'#'、';' 和数字。

如何将 'xmlcharrefreplace' ascii 解码为 UTF-8,以将其与 python3(UTF-8) 代码中的硬编码俄罗斯符号进行比较:

#!/usr/bin/python3

import sys

print(sys.getdefaultencoding())
print(sys.stdout.encoding)

ru_abc = set(['а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'])
stat_data = { 'other': {}, \
            'russian': {} }

for letter in open( filename ).read():
    if letter in ru_abc:
        if letter in stat_data['russian']:
           stat_data['russian'][letter] += 1
        else:
           stat_data['russian'][letter] = 1
    else:
        if letter in stat_data['other']:
           stat_data['other'][letter] += 1
        else:
           stat_data['other'][letter] = 1
print( stat_data )

我的标准输出看起来像:

 utf-8
 UTF-8
 {'russian': {}, 'other': {'~': 3, '=': 169, '<': 300, '?': 473, '>': 312, ';': 318392, ':': 222, '%': 29, "'": 31, '&': 318409, '!': 36, ' ': 51427, '#': 318390, '"': 320, '-': 9822, ',': 21578, '/': 843, '.': 800, ')': 527, '(': 526, '+': 2, ']': 8, '_': 117, '[': 8, '|': 1, '\r': 224, '\n': 224, '\t': 38, '`': 3, '5': 31451, '4': 23216, '7': 131141, '6': 40036, '1': 352560, '0': 373246, '3': 25196, '2': 37785, '9': 81825, '8': 177608, 'u': 3354, 't': 7281, 'w': 1179, 'v': 1074, 'q': 214, 'p': 2966, 's': 5816, 'r': 6948, 'y': 1714, 'x': 318, 'z': 222, 'e': 10841, 'd': 2918, 'g': 1996, 'f': 1801, 'a': 7069, 'c': 4020, 'b': 1805, 'm': 2337, 'l': 4821, 'o': 5906, 'n': 6307, 'i': 8068, 'h': 2559, 'k': 902, 'j': 142}}
4

1 回答 1

2

使用html.parser.HTMLParser()

from html.parser import HTMLParser

parser = HTMLParser()

with open(filename) as fileobj:
    for line in fileobj:
        line = parser.unescape(line)

演示:

>>> parser.unescape('        "python - &#1087;&#1080;&#1090;&#1086;&#1085;, &#1087;&#1088;&#1086;&#1088;&#1080;&#1094;&#1072;&#1090;&#1077;&#1083;&#1100;",')
'        "python - питон, прорицатель",'

我会使用一个collections.Counter()对象来计算字符:

from collections import Counter
from html.parser import HTMLParser

ru_abc = set('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
parser = HTMLParser()
stat_data = {'other': Counter(), 'russian': Counter()}


with open(filename) as fileobj:
    for line in fileobj:
        line = parser.unescape(line)
        stat_data['russian'].update(c for c in line if c in ru_abc)
        stat_data['other'].update(c for c in line if c not in ru_abc)

结果:

{
    'other': Counter({' ': 23, ',': 4, '"': 4, '\n': 3, 'o': 2, '-': 2, 'y': 1, 't': 1, 'b': 1, 'r': 1, 'p': 1, 'n': 1, 'h': 1, 'c': 1, 'a': 1}),
    'russian': Counter({'о': 5, 'а': 3, 'р': 3, 'п': 2, 'к': 2, 'и': 2, 'е': 2, 'я': 2, 'т': 2, 'н': 1, 'м': 1, 'л': 1, 'з': 1, 'в': 1, 'б': 1, 'ь': 1, 'ч': 1, 'ц': 1})
}
于 2013-07-24T16:05:54.950 回答