簡體   English   中英

保留ruamel.yaml中的引號

[英]Preserving quotes in ruamel.yaml

我正在使用ruamel.yaml來修改YAML文件。 我的要求是為現有密鑰添加一個值,保留包括訂單在內的所有其他內容。 我讓它工作,但看起來其他鍵/值的引號也在過程中被修改。

  1. 在某些情況下,雙引號會轉換為單引號。 例如

    之前

     node_js: - "0.10" 

     node_js: - '0.10' 
  2. 在其他一些情況下,報價完全被刪除。 例如:

    之前

     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.

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