Чтение управляющих последовательностей utf-8 из файла

У меня есть файл с кодировкой utf-8, который содержит несколько строк, например

\x02I don't like \x0307bananas\x03.\x02
Hey, how are you doing?
You called?

Как мне прочитать строки этого файла в список, расшифровав все escape-последовательности? Я попробовал код ниже:

with codecs.open(file, 'r', encoding='utf-8') as q:
    quotes = q.readlines()

print(str(random.choice(quotes)))

Но он печатает строку без декодирования escape-символов.

\x02I don't like \x0307bananas\x03\x02

(Примечание: escape-символы — это цветовые коды IRC, \x02 — это символ для текста, выделенного жирным шрифтом, а префикс \x03 — для цветовых кодов. Кроме того, этот код взят из моего IRC-бота, а функция MSG заменена на print())


person zertap    schedule 29.05.2014    source источник


Ответы (3)


Согласно этому ответу, изменение следующего должно иметь ожидаемый результат.

В Python 3:

codecs.open(file, 'r', encoding='utf-8') to

codecs.open(file, 'r', encoding='unicode_escape')

В Python 2:

codecs.open(file, 'r', encoding='string_escape')

person zertap    schedule 29.05.2014

Решение, как предложили некоторые люди, заключается в использовании codecs.open(file, 'r', encoding='unicode_escape'), которое после реализации будет выглядеть следующим образом:

with codecs.open(file, 'r', encoding='unicode_escape') as q:
    quotes = q.readlines()

print(str(random.choice(quotes)))

Если вы используете обычное декодирование utf-8, результат для \x02I don't like \x0307bananas\x03.\x02 на самом деле будет "\\x02I don't like \\x0307bananas\\x03.\\x02\n", потому что метод readlines() будет экранировать символы для вас

person Andrew    schedule 10.05.2021

Если вы хотите выводить текст на консоль с тем же форматированием, то дело в том, что UNIX (или какую ОС вы используете?) использует escape-последовательности ANSI, отличные от тех, что в IRC, поэтому вам нужно перевести формат IRC в формат UNIX. это ссылки для запуска:
https://stackoverflow.com/a/287944/2660503
Цвет текста в терминальных приложениях в UNIX

Если вы хотите напечатать текст без форматирования, просто очистите его, используя регулярное выражение.

person eyeinthebrick    schedule 29.05.2014
comment
спасибо, но этот фрагмент из моего IRC-бота, я просто заменил функцию MSG на print(). Я отредактирую свой вопрос, чтобы упомянуть об этом. - person zertap; 29.05.2014