2017-02-07 2 views
1

Я использую ruamel.yaml для изменения файла YAML. Мое требование - добавить значение для существующего ключа, сохраняя все остальное, включая заказ. Я получил его на работу, но похоже, что в этом процессе также изменяются кавычки других ключей/значений.Сохранение котировок в ruamel.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() для его записи.

+0

я как-то упускается из виду, что вы используете 'load_yaml_guess_indent()', вы можете указать 'preserve_quotes = true' для этой функции этот аргумент будет передан функции 'round_trip_load()' – Anthon

+0

Спасибо. Я понял это.Будет неплохо иметь ссылку на все поддерживаемые опции, например. – keheliya

ответ

0

По умолчанию 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())

Смежные вопросы