簡體   English   中英

如何在python中存儲或讀取yaml中的文字回車符和換行符

[英]How to store or read a literal carriage return and newline from yaml in python

我一整天都在努力解決這個問題。 我似乎無法在網上找到答案。 我有一個yaml文檔,為我的消息/響應服務器存儲一些服務器配置,其中一個參數是“message_terminator”。 正如您所猜測的那樣,這是我的服務器知道要查找的客戶端發送的消息的消息終止符。

\r\n 

是telnet發送的默認值,所以我已經設置了它。

Yaml文件:

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

我想要做的是讀取message_terminator值作為實際的回車和換行或將其從其字符串表示轉換為其二進制轉義碼:return和換行,而不是字符串表示“\\ 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的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文件讀取的換行符。

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"

YAML規范1.2的第5.7節

5.7。 逃脫的角色

必須轉義所有不可打印的字符。 YAML轉義序列使用大多數現代計算機語言常用的“\\”符號。 必須將每個轉義序列解析為適當的Unicode字符。 原始轉義序列是演示細節,不得用於傳達內容信息。

請注意,轉義序列僅在雙引號標量中進行解釋。 在所有其他標量樣式中,“\\”字符沒有特殊含義,並且不可打印的字符不可用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM