Анализ текста UnicodeDecodeError: кодек 'charmap' не может декодировать байт 0x81 в позиции 1671718: символ отображается в <undefined>

Я написал код для создания таблицы частот. но это ломается на линии ext_string = document_text.read().lower(, Я даже попытался, кроме как поймать ошибку, но это не помогает.

import re
import string
frequency = {}
file = open('EVG_text mining.txt', encoding="utf8")
document_text = open('EVG_text mining.txt', 'r')
text_string = document_text.read().lower()
match_pattern = re.findall(r'\b[a-z]{3,15}\b', text_string)
for word in match_pattern:
    try:
        count = frequency.get(word,0)
        frequency[word] = count + 1
    except UnicodeDecodeError:
        pass

frequency_list = frequency.keys()

for words in frequency_list:
    print (words, frequency[words])

1 ответ

Вы открываете свой файл дважды, второй раз без указания кодировки:

file = open('EVG_text mining.txt', encoding="utf8")
document_text = open('EVG_text mining.txt', 'r')

Вы должны открыть файл следующим образом:

frequencies = {}
with open('EVG_text mining.txt', encoding="utf8", mode='r') as f:
    text = f.read().lower()

match_pattern = re.findall(r'\b[a-z]{3,15}\b', text)
...

Во второй раз, когда вы открывали свой файл, вы не определяли, какую кодировку использовать, и, вероятно, именно поэтому он допустил ошибку. Оператор with помогает выполнить определенную задачу, связанную с вводом-выводом для файла. Вы можете узнать больше об этом здесь: https://www.pythonforbeginners.com/files/with-statement-in-python

Вам, вероятно, следует взглянуть на обработку ошибок, а также на то, что вы не заключили строку, которая фактически вызывала ошибку: https://www.pythonforbeginners.com/error-handling/

Код, игнорирующий все проблемы с декодированием:

import re
import string  # Do you need this?

with open('EVG_text mining.txt', mode='rb') as f:  # The 'b' in mode changes the open() function to read out bytes.
    bytes = f.read()
    text = bytes.decode('utf-8', 'ignore') # Change 'ignore' to 'replace' to insert a '?' whenever it finds an unknown byte.

match_pattern = re.findall(r'\b[a-z]{3,15}\b', text)

frequencies = {}
for word in match_pattern:  # Your error handling wasn't doing anything here as the error didn't occur here but when reading the file.
    count = frequencies.setdefault(word, 0)
    frequencies[word] = count + 1

for word, freq in frequencies.items():
    print (word, freq)

Чтобы прочитать файл с некоторыми специальными символами, используйте кодировку latin1 или unicode_escape.

Другие вопросы по тегам