Запись строки с escape-последовательностями ANSI в файл
Модуль Python, который я использую, обеспечивает ловушку, которая позволяет захватывать ввод с клавиатуры пользователя перед его отправкой на терминал оболочки. Проблема, с которой я сталкиваюсь, заключается в том, что он вводит ввод за символом, что затрудняет захват команд ввода, когда пользователь выполняет такие действия, как возврат или перемещение курсора.
Например, с учетом строки выхода \x1b[4D\x1b[J- покажи себя, происходит следующее:
>>> a = exit\x1b[4D\x1b[Jshow myself out
>>> print(a)
show myself out
>>> with open('file.txt', 'w+') as f:
>>> f.write(a)
>>> exit()
less abc.txt
Команда less отображает необработанную команду (exit\x1b[4D\x1b[Jshowself out)), когда на самом деле я бы хотел, чтобы она сохранялась "чисто", как она отображается при использовании функции печати (показать себя).
Печать результата или "кошачий" файл показывают именно то, что я хотел бы отобразить, но я предполагаю, что терминал преобразует вывод.
Есть ли способ добиться "чистой" записи в файл, используя какой-либо модуль python или какую-либо утилиту bash? Конечно, должен быть какой-то модуль, который может сделать это для меня?
1 ответ
less
интерпретирует управляющие символы.
Вы можете обойти это с -r
опция командной строки:
$ less -r file.txt
show myself out
Из руководства:
-r or --raw-control-chars
Causes "raw" control characters to be displayed. The default is
to display control characters using the caret notation; for
example, a control-A (octal 001) is displayed as "^A". Warning:
when the -r option is used, less cannot keep track of the actual
appearance of the screen (since this depends on how the screen
responds to each type of control character). Thus, various dis‐
play problems may result, such as long lines being split in the
wrong place.
Необработанные управляющие символы отправляются на терминал, который затем интерпретирует их как cat
было бы.
Как уже говорили другие, вам нужно будет самостоятельно интерпретировать символы, прежде чем записывать их в файл.