【问题标题】:Preserving quotes in ruamel.yaml在 ruamel.yaml 中保留引号
【发布时间】:2017-06-24 23:27:43
【问题描述】:

我正在使用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() 将其写回。

【问题讨论】:

  • 我不知何故忽略了您正在使用load_yaml_guess_indent(),您也可以为该函数指定preserve_quotes=True,该参数将传递给round_trip_load()函数
  • 谢谢。我明白了。最好能参考所有受支持的选项,就像这样。

标签: python yaml ruamel.yaml


【解决方案1】:

yaml.preserve_quotes = True 在当前版本的ruamel.yaml 中工作。

【讨论】:

    【解决方案2】:

    默认情况下,ruamel.yaml “规范化”诸如缩进之类的内容并删除任何多余的引号。它还默认为输出单引号,当那些是必要的,因为那些表示更简单的字符串(即只有单引号具有特殊含义,这些是区分可以解释为数字的字符串的更好/更简单的选项,而不是双引号)。

    您可能错过的是您必须明确告诉round_trip_loader() 保留引号,使用preserve_quotes=True 参数:

    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()

    【讨论】:

      猜你喜欢
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-05-22
      • 1970-01-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      相关资源
      最近更新 更多