Как сохранить или прочитать литеральный возврат каретки и новую строку из yaml в python
я борюсь с этой проблемой весь день. Я тоже не мог найти ответ в интернете. У меня есть документ yaml, который хранит некоторую конфигурацию сервера для моего сервера сообщений/ответов, и один из параметров - "message_terminator". Как вы можете догадаться, это то, что мой сервер знает, чтобы выглядеть как Терминатор сообщений, отправленных клиентам.
rn
по умолчанию отправляется telnet, поэтому я установил его как таковой.
в YAML Документ:
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: rn
то, что я хочу сделать, это либо прочитать значение message_terminator как фактическое возвращение каретки и новую строку, либо преобразовать его из строкового представления в двоичные escape-коды: return и newline, а не строковое представление "rn"
например, если я делаю в Python:
print('rn')
он печатает возврат каретки и новую строку, а не символы. Но если я прочитаю значение из конфигурации yaml в python с:
print(config['global']['message_terminator'])
он печатает символы:
rn
изменение документов Yaml и добавление кавычек, таких как:
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: 'rn'
и
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: b'rn'
или даже
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: !!str rn
или
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: !!python/bytes b'rn'
не имеет никакого эффекта. Когда Терминатор сообщения распечатан, он печатает символы. Когда его отправляют по сети клиентам,его символы.
я тоже пробовал например:
print(bytes(config['global']['message_terminator'], 'utf-8').encode('unicode_escape'))
который все еще просто распечатывает символы.
пожалуйста, извините меня, если я просто совершенно неправильно или пропустил что-то большое. Я все еще работаю над всей разницей между строками, байтами,необработанными строками и т. д. Любые советы или указатели приветствуются. Спасибо, что уделили мне время.
Редактировать @Jan: Когда это делается в интерпретаторе, он работает. Я получаю карету и печатаю новую линию. Не письмена.
>>> text = """
... val: "hellonrnew line"
... """
>>> text
'nval: "hellonrnew line"n'
>>> print(text)
val: "hellonrnew line"
>>> import yaml
>>> data = yaml.load(text)
>>> data
{'val': 'hellonrnew line'}
>>> print(data['val'])
hello
new line
>>>
но в моем основном коде, когда я загружаю из файла yaml, он печатает rn не фактический возврат каретки и новую строку. Этот код python:
TERM = config['global']['message_terminator']
print(TERM)
print(config['global']['message_terminator'])
print("netcmd server started on port", PORT)
печатает это в терминале:
$ python3 netcmd.py
rn
rn
netcmd server started on port 7040
чтобы уточнить, я хочу, чтобы действие возврата каретки и новой строки, а не есть символ.
Edit 2: Проблема решена. Я меняю файл yaml после обновления Jan от:
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: "rn"
to
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: "rn"
все работает сейчас, и код python печатает фактически возврат каретки и новую строку, прочитанную из файла yaml.
1 ответов
YAML позволяет избежать использования \ character, но вы должны поместить значение в кавычки:
>>> text = """
... val: "hello\n\rnew line"
... """
...
>>> text
'\nval: "hello\n\rnew line"\n'
>>> data = yaml.load(text)
>>> data
{'val': 'hello\n\rnew line'}
Итак, ваш файл с global
будет работать следующим образом:
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: "\r\n"
раздел 5.7 спецификации YAML 1.2:
5.7. Экранированные Символы
все непечатаемые символы должны быть экранированы. Escape-последовательности YAML используют обозначения"\", общие для большинства современных компьютерных языков. Каждая escape-последовательность должна быть проанализирована в соответствующий Unicode характер. Исходная escape-последовательность является детализацией презентации и не должна использоваться для передачи информации о содержимом.
обратите внимание, что escape-последовательности интерпретируются только в скалярах с двойными кавычками. Во всех других скалярных стилях символ " \ " не имеет специального значения, а непечатаемые символы недоступны.