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

时间:2014-06-18 17:09:49

标签: python yaml

我整天都在努力解决这个问题。我似乎无法在网上找到答案。 我有一个yaml文档,为我的消息/响应服务器存储一些服务器配置,其中一个参数是“message_terminator”。您可以猜测,这是我的服务器知道要查找的客户端发送的消息的消息终止符。

\r\n 

是telnet发送的默认值,所以我已将其设置为。

Yaml文件:

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

我想要做的是将message_terminator值读取为实际的回车符和换行符,或者将其从字符串表示形式转换为其二进制转义码:return和newline,而不是字符串表示“\ r \ n”< / p>

例如,如果我在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: b'\r\n'

甚至

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

global:
    server_port: 7040
    bound_ip: 0.0.0.0
    message_terminator: !!python/bytes b'\r\n'

无效。 打印出消息终止符时,它会打印字符。 当它通过网络发送给客户端时,它的字符。

我也尝试过这样的事情:

print(bytes(config['global']['message_terminator'], 'utf-8').encode('unicode_escape'))

仍然只打印出字符。

请原谅我,如果我完全错了或者遗漏了一些大事。 我还在研究字符串,字节,原始字符串等之间的全部区别。 任何建议或指示欢迎。 谢谢你的时间。

编辑@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的Update之后更改了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: "\r\n"

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

1 个答案:

答案 0 :(得分:7)

YAML允许使用\字符进行转义,但您必须将值放入引号:

>>> 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"

Section 5.7 of YAML spec 1.2

5.7。逃脱的角色

必须转义所有不可打印的字符。 YAML转义序列使用大多数现代计算机语言常用的“\”符号。必须将每个转义序列解析为适当的Unicode字符。原始转义序列是演示细节,不得用于传达内容信息。

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