Ошибка записи Unicode: charmap не может закодировать символ
У меня есть текст, в котором у меня есть резюме. Я привожу это резюме с некоторыми регулярными выражениями, поскольку текст всегда имеет одинаковую структуру.
В резюме есть предложение "ИМЯ классифицируется как…", и я должен заменить его на заголовок, захваченный в тексте и состоящий из слов 1 и 2, разделенных запятой. Пока я это делаю, он работает нормально (поэтому я не буду добавлять полный код, потому что он очень большой, и я не могу это сделать, и в любом случае проблема не в том, что я предоставлю.
Мне нужно добавить символ Unicode \u2191 или \u2193 в зависимости от word1 к нему, который связан с положительным или отрицательным значением в словаре. Это должно быть сделано перед заменой предложения. Мой код в основном следующий:
import re
import io
file=open(Summaries_file,'a')#also tried open(Summaries_file,'a', encoding="UTF_16_LE") and file=io.open(Summaries_file,'a', encoding="UTF_16_LE")
code_dict["page"]="Word1\u2191"
page="page"
summary = "Data is: 111919919. Name is classified as an infered value".
print(summary)
#OUTPUT>"Data is: 111919919. Name is classified as an infered value".
title= "Word1, Word2"
#this is the part added to regular code>>>>
titlelist=title.split(",")
if titlelist[0]==code_dict[page]:
titlelist[0]=code_dict[page]+"\u2191"
title=str(titlelist)
print(titlelist[0])
#OUTPUT>"Word1↑"#It displays the arrow well
print(title) #ok, too.
#OUTPUT>"Word1↑, Word2"
#We go back to the end of the normal code
insert=re.compile("is classified as")
print(type(summary))
#<class 'str'>
summary=str(insert.sub(title, summary))
print(summary)
#OUTPUT>"Data is: 111919919. Name Word1↑, Word2 an infered value".
print("passed")
file.write(title+'\n')
file.write(summary+'\n')
Затем Traceback (последний вызов последним):
File "<ipython-input-1-6bc913872cc9>", line 1, in <module>
runfile('C:/Python Scripts/txtad.py', wdir='C:/Users/Laurent/Documents/Python Scripts')
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile
execfile(filename, namespace)
File "C:\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 88, in execfile
exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
File "C:/Python Scripts/txtad", line 380, in <module>
file.write(title+'\n')
File "C:\Anaconda3\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2191' in position 11: character maps to <undefined>
Теперь я не могу понять это, и я серьезно зациклен на этом.
Я не знаю, почему его не удается записать в первую очередь, поскольку он хорошо отображает признаки и что в некоторых тестах я явно кодирую нужную систему, даже открывая файл с правильной кодировкой.
Я пробовал разные вещи, которые вы можете прочитать там:
Действительно, оригинальный код больше, но я попробовал это, и он работал так же, и типы ввода строго идентичны.
Я прочитал это:
UnicodeEncodeError: кодек 'charmap' не может закодировать символ '\u2010': символ отображается на
UnicodeEncodeError: кодек 'charmap' не может кодировать символы
Python, Unicode и консоль Windows
python 3.2 UnicodeEncodeError: кодек 'charmap' не может кодировать символ '\u2013' в позиции 9629: символ отображается на
В конце концов, они более запутанны, чем все остальное.
В любом случае проблема не в консоли, как в других постах, поскольку проблема возникает с инструкцией записи, которая не отображается, и, кроме того, символ хорошо отображается на моей консоли...
Я действительно не могу сказать, что происходит и как справиться с этой проблемой.
Спасибо за ваши идеи.
1 ответ
Я наконец-то решил это, прочитав эту статью и связанные с ней статьи, а также комментарий Тадхг Макдональда-Дженсена; Записывает текст Unicode в текстовый файл?
На самом деле мне просто нужно открыть (file,"wb",) и кодировать во время записи для каждой строки (так как они не являются байтами). Я думаю, я мог бы использовать импорт Io или кодеков и открыть с использованием обратной совместимости.