如何在python中存储或读取来自yaml的文字回车和换行符 |
您所在的位置:网站首页 › python中的回车 › 如何在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 值读取为实际的回车和换行符,或者将其从其字符串表示形式转换为其二进制转义码:返回和换行符,而不是字符串表示形式 "\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为了澄清,我想要回车和换行的动作,而不是字符表示。 编辑 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 文件中读取的实际回车和换行符。 AnswersYAML 允许使用 \ 字符进行转义,但您必须将值放在引号中: >>> 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"YAML 规范 1.2的第 5.7 节: 5.7.转义字符 所有不可打印的字符都必须转义。 YAML 转义序列使用大多数现代计算机语言通用的“\”符号。每个转义序列都必须解析为适当的 Unicode 字符。原始转义序列是表示细节,不得用于传达内容信息。 请注意,转义序列仅在双引号标量中解释。在所有其他标量样式中,“\”字符没有特殊含义,并且不可打印的字符不可用。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |