Ошибка записи 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>

Теперь я не могу понять это, и я серьезно зациклен на этом.
Я не знаю, почему его не удается записать в первую очередь, поскольку он хорошо отображает признаки и что в некоторых тестах я явно кодирую нужную систему, даже открывая файл с правильной кодировкой.

Я пробовал разные вещи, которые вы можете прочитать там:

https://stackru.com/questions/43706177/solving-error-when-adding-an-unicode-character-to-splits-of-a-string-then-revert?noredirect=1

Действительно, оригинальный код больше, но я попробовал это, и он работал так же, и типы ввода строго идентичны.

Я прочитал это:
UnicodeEncodeError: кодек 'charmap' не может закодировать символ '\u2010': символ отображается на ;
UnicodeEncodeError: кодек 'charmap' не может кодировать символы
Python, Unicode и консоль Windows
python 3.2 UnicodeEncodeError: кодек 'charmap' не может кодировать символ '\u2013' в позиции 9629: символ отображается на ;
В конце концов, они более запутанны, чем все остальное.

В любом случае проблема не в консоли, как в других постах, поскольку проблема возникает с инструкцией записи, которая не отображается, и, кроме того, символ хорошо отображается на моей консоли...
Я действительно не могу сказать, что происходит и как справиться с этой проблемой.
Спасибо за ваши идеи.

1 ответ

Решение

Я наконец-то решил это, прочитав эту статью и связанные с ней статьи, а также комментарий Тадхг Макдональда-Дженсена; Записывает текст Unicode в текстовый файл?

На самом деле мне просто нужно открыть (file,"wb",) и кодировать во время записи для каждой строки (так как они не являются байтами). Я думаю, я мог бы использовать импорт Io или кодеков и открыть с использованием обратной совместимости.

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