Анализ текста 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.