- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我整天都在为这个问题苦苦挣扎。我似乎也无法在网上找到答案。我有一个 yaml 文档,它为我的消息/响应服务器存储了一些服务器配置,其中一个参数是“message_terminator”。您可以猜到,这是我的服务器知道要查找的内容,作为客户端发送的消息的消息终止符。
\r\n
默认是通过telnet发送的,所以我就这样设置了。
Yaml 文档:
global:
server_port: 7040
bound_ip: 0.0.0.0
message_terminator: \r\n
我想要做的是要么将 message_terminator 值读取为实际的回车符和换行符,要么将其从其字符串表示形式转换为其二进制转义码:返回和换行符,而不是字符串表示形式“\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: 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
澄清一下,我想要回车和换行的 Action ,而不是字符表示。
编辑 2:问题解决了。我在 Jan 的更新后更改了 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 文件读取的实际回车符和换行符。
最佳答案
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 字符。原始转义序列是表示细节,不得用于传达内容信息。
请注意,转义序列仅在双引号标量中解释。在所有其他标量样式中,“\”字符没有特殊含义,不可打印字符不可用。
关于python - 如何在 python 中从 yaml 存储或读取文字回车符和换行符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24291402/
我是一名优秀的程序员,十分优秀!