Как сохранить или прочитать литеральный возврат каретки и новую строку из 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-последовательности интерпретируются только в скалярах с двойными кавычками. Во всех других скалярных стилях символ " \ " не имеет специального значения, а непечатаемые символы недоступны.