[英]Preserving quotes in ruamel.yaml
我正在使用ruamel.yaml
來修改YAML文件。 我的要求是為現有密鑰添加一個值,保留包括訂單在內的所有其他內容。 我讓它工作,但看起來其他鍵/值的引號也在過程中被修改。
在某些情況下,雙引號會轉換為單引號。 例如
之前
node_js: - "0.10"
后
node_js: - '0.10'
在其他一些情況下,報價完全被刪除。 例如:
之前
before_script: - "cp test/config-x.js src/config.js"
后
before_script: - cp test/config-x.js src/config.js
這兩種情況都出現在同一個文件中。 如何阻止這種情況發生並保留原始引號?
我使用load_yaml_guess_indent()
進行加載,使用round_trip_dump()
進行寫入。
默認情況下,ruamel.yaml“標准化”縮進等內容並刪除任何多余的引號。 它也默認為輸出上的單引號,當那些是必要的時,因為它們表示更簡單的字符串(即只有單引號具有特殊含義,並且這些是更好/更簡單的選項來區分可被解釋為數字而不是雙引號的字符串)。
您可能錯過的是您明確必須使用preserve_quotes=True
參數告訴 round_trip_loader()
保留引號 :
import sys
import ruamel.yaml
yaml_str_1 = """\
node_js:
- "0.10"
"""
yaml_str_2 = """\
before_script:
- "cp test/config-x.js src/config.js"
"""
data = ruamel.yaml.round_trip_load(yaml_str_1, preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, sys.stdout)
print('=====')
data = ruamel.yaml.round_trip_load(yaml_str_2, preserve_quotes=True)
ruamel.yaml.round_trip_dump(data, sys.stdout)
得到:
node_js:
- "0.10"
=====
before_script:
- "cp test/config-x.js src/config.js"
使用該選項,所有字符串都加載到特殊的字符串子類中,然后在加載時輸出。 如果替換這樣的加載值,則需要使用這些類,因為只分配新值不會保留類型。 添加:
data['before_script'][0] = type(data['before_script'][0])('ln -s xxx /usr/local/bin')
ruamel.yaml.round_trip_dump(data, sys.stdout)
得到:
before_script:
- "ln -s xxx /usr/local/bin"
(該類型恰好是ruamel.yaml.scalarstring.DoubleQuotedScalarString()
)
yaml.preserve_quotes = True
適用於當前版本的ruamel.yaml
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.