Вы совершаете ненужное кодирование / декодирование в оба конца.
Проверьте этот небольшой интерактивный сеанс:
>>> s = 'electronică'
>>> b = s.encode('utf-8')
>>> b
b'electronic\xc4\x83'
>>> str(b)
"b'electronic\\xc4\\x83'"
- Сначала у вас есть строка
s
, которую вы кодируете - вы получаете объект bytes
(обратите внимание на обозначение b'...'
).
- Затем вы вызываете
str()
для него, который снова преобразует его в строку - но не путем декодирования, а с использованием дополнительных кавычек и escape-последовательностей.
- Когда вы вызываете
f.writelines()
, эта строка снова внутренне декодируется для записи на диск. Но так как все это ASCII, этот последний шаг не очевиден.
Вы должны обязательно открыть файлы с правильной кодировкой с самого начала.
Тогда вам больше не придется использовать line.encode('utf-8')
.
Таким образом:
f = open("demofile.txt", "w", encoding="utf-8")
А потом позже:
f.writelines(lines)
Обратите внимание, что нет необходимости делать for line in lines
, если вы используете writelines
; он уже предназначен для использования с повторяющимися строками.
Когда вы открываете полученный файл, убедитесь, что вы используете редактор, который поддерживает UTF-8.
Примечательно, что «простые» инструменты Windows, такие как Блокнот, обычно не могут правильно отображать файлы UTF-8.