Интерпретация вывода Python относительно символов utf8 - PullRequest
0 голосов
/ 16 октября 2018

У меня есть файл .txt, и мне нужно посчитать частоту всех символов в нем, чтобы выполнить простой анализ частоты для моего упражнения по криптологии.

Я думаю, что код работал нормально, но кажется, что у Python есть проблемы с чтением таких символов, как Ä, Ö, ß и т. Д. (Немецкий алфавит).Поскольку код читает файл .txt, я предполагаю, что он в формате utf8.

Это вывод:

Counter({' ': 168, 'S': 136, '\xc3': 103, 'Z': 83, 'G': 80, 'P': 80,
'W': 76, 'J': 66, 'O': 63, 'Q': 62, 'R': 57, 'U': 57, 'L': 47, '\x84': 43,
'K': 39, '\x9c': 28, 'X': 25, 'A': 23, 'C': 22, '\x9f': 18, 'E': 17, 'N':
17, '\x96': 14, ',': 11, 'D': 8, 'Y': 8, 'T': 6, 'V': 6, 'B': 5, '"': 4,
"'": 3, 'F': 2, 'M': 2, '!': 1, '-': 1, '?': 1}) [Finished in 0.1s]

Мой вопрос заключается в том, как интерпретировать символы обратной косой черты, такие как \ xc3 и т. Д.Я не могу найти в Интернете ничего о том, как перевести это?

Редактировать (мой код):

from collections import Counter
with open('/Users/StB/Downloads/text.txt') as f:
    c = Counter()
    for x in f:
        c += Counter(x.strip())
print c

Редактировать 2:

Новый вывод:

Counter({' ': 168, 'S': 136, 'Z': 83, 'P': 80, 'G': 80, 'W': 76, 'J': 66, 'O': 63, 'Q': 62, 'R': 57, 'U': 57, 'L': 47, 'Ä': 43, 'K': 39, 'Ü': 28, 'X': 25, 'A': 23, 'C': 22, 'ß': 18, 'N': 17, 'E': 17, 'Ö': 14, ',': 11, 'Y': 8, 'D': 8, 'T': 6, 'V': 6, 'B': 5, '"': 4, "'": 3, 'F': 2, 'M': 2, '-': 1, '!': 1, '?': 1})

новый код:

from collections import Counter
with open('/Users/StB/Downloads/text.txt', encoding= 'utf - 8') as f:
    c = Counter()
    for x in f:
        c += Counter(x.strip())
print (c)

endcoding не работает на версии, которую я использовал для возвышенного текста.Работает нормально в IDLE, хотя!

1 Ответ

0 голосов
/ 16 октября 2018

В случае Python 2 вам нужно будет явно декодировать строку, которую вы читаете, в Unicode.Вы также можете использовать метод Counter.update, чтобы избежать создания и удаления Counter объектов.

from collections import Counter
with open('/Users/StB/Downloads/text.txt') as f:
    c = Counter()
    for x in f:
        c.update(x.decode('utf-8').strip())
print c
...