如何在python中存储或读取yaml中的文本回车符和换行符

如何在python中存储或读取yaml中的文本回车符和换行符,python,yaml,Python,Yaml,我整天都在与这个问题作斗争。我似乎也无法在网上找到答案。 我有一个yaml文档,它为我的消息/响应服务器存储了一些服务器配置,其中一个参数是“message_terminator”。正如您所猜测的,这就是我的服务器所知道的,作为客户端发送的消息的消息终止符来查找的内容 \r\n 是telnet发送的默认值,因此我将其设置为telnet Yaml文件: global: server_port: 7040 bound_ip: 0.0.0.0 message_termina

我整天都在与这个问题作斗争。我似乎也无法在网上找到答案。 我有一个yaml文档,它为我的消息/响应服务器存储了一些服务器配置,其中一个参数是“message_terminator”。正如您所猜测的,这就是我的服务器所知道的,作为客户端发送的消息的消息终止符来查找的内容

\r\n 
是telnet发送的默认值,因此我将其设置为telnet

Yaml文件:

global:
    server_port: 7040
    bound_ip: 0.0.0.0
    message_terminator: \r\n
我要做的是将消息\u终止符值作为实际的回车和换行符读取,或者将其从字符串表示形式转换为二进制转义码:回车和换行符,而不是字符串表示形式“\r\n”

例如,如果我在python中这样做:

print('\r\n')
它打印回车和换行符,而不是字符。 但是如果我使用以下命令从python中的yaml配置中读取值:

print(config['global']['message_terminator'])
它会打印出以下字符:

\r\n
更改Yaml文档并添加引号,如:

global:
    server_port: 7040
    bound_ip: 0.0.0.0
    message_terminator: '\r\n'

甚至

global:
    server_port: 7040
    bound_ip: 0.0.0.0
    message_terminator: !!str \r\n

没有效果。 当消息终止符打印出来时,它将打印字符。 当它通过网络发送到客户机时,它将显示字符

>>> text = """
... val: "hello\\n\\rnew line"
... """
>>> text
'\nval: "hello\\n\\rnew line"\n'
>>> print(text)

val: "hello\n\rnew line"

>>> import yaml
>>> data = yaml.load(text)
>>> data
{'val': 'hello\n\rnew line'}
>>> print(data['val'])
hello
new line
>>> 
我也尝试过这样的事情:

print(bytes(config['global']['message_terminator'], 'utf-8').encode('unicode_escape'))
它仍然只是打印出字符

>>> text = """
... val: "hello\\n\\rnew line"
... """
>>> text
'\nval: "hello\\n\\rnew line"\n'
>>> print(text)

val: "hello\n\rnew line"

>>> import yaml
>>> data = yaml.load(text)
>>> data
{'val': 'hello\n\rnew line'}
>>> print(data['val'])
hello
new line
>>> 
请原谅,如果我完全错了,或者遗漏了一些重要的东西。 我仍然在计算字符串、字节、原始字符串等之间的全部差异。 欢迎任何建议或指点。 谢谢你抽出时间

编辑@Jan: 当在解释器中这样做时,它会工作。我得到一辆马车和一条新线。 不是角色

>>> text = """
... val: "hello\\n\\rnew line"
... """
>>> text
'\nval: "hello\\n\\rnew line"\n'
>>> print(text)

val: "hello\n\rnew line"

>>> import yaml
>>> data = yaml.load(text)
>>> data
{'val': 'hello\n\rnew line'}
>>> print(data['val'])
hello
new line
>>> 
但在我的主代码中,当我从yaml文件加载时,它会打印\r\n而不是实际的回车和换行符。 此python代码:

TERM = config['global']['message_terminator']
print(TERM)
print(config['global']['message_terminator'])
print("netcmd server started on port", PORT)
在终端中打印:

$ python3 netcmd.py
\r\n
\r\n
netcmd server started on port 7040
为了澄清,我想要回车和换行的动作,而不是字符表示

编辑2: 问题解决了。Jan更新后,我将yaml文件更改为:

global:
    server_port: 7040
    bound_ip: 0.0.0.0
    message_terminator: "\\r\\n"


现在一切正常,python代码打印出从yaml文件读取的实际回车和换行符。

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转义序列使用大多数现代计算机语言通用的“\”符号。必须将每个转义序列解析为相应的Unicode字符。原始转义序列是演示细节,不得用于传达内容信息


注意,转义序列仅在双引号标量中解释。在所有其他标量样式中,“\”字符没有特殊含义,不可打印的字符不可用。

更具体地说,只有在使用双引号时才有效。单引号无法在我的原始问题中查看上面的编辑。我试了你的建议。查看输出。我正在使用python 3.4.1、PyYAML 3.11和YAML spec 1.1Oh wait,我在YAML(\\r\\n”)not(“\r\n”)文件中使用了双转义,就像在解释器中一样。你的编辑有帮助。问题解决了。谢谢
global:
    server_port: 7040
    bound_ip: 0.0.0.0
    message_terminator: "\r\n"