Возможно ли сохранить структуру блока YAML при сбрасывании анализируемого документа?

Мы используем PyYAML для готовых конфигурационных файлов для разных сред. Но наши блоки YAML теряют целостность.

input.yml

 pubkey: | -----BEGIN PUBLIC KEY----- MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2 UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK EsUgJHXcpw7OPxRrCQIDAQAB -----END PUBLIC KEY----- 

… выполнение этой программы с помощью python3 …

 import yaml with open('input.yml', mode='r') as f: parsed = yaml.safe_load(f) with open('output.yml', mode='w') as f: yaml.dump(parsed, f) 

… производит этот output.yml

 pubkey: '-----BEGIN PUBLIC KEY----- MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2 UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK EsUgJHXcpw7OPxRrCQIDAQAB -----END PUBLIC KEY----- ' 

Можно ли сохранить структуру моего блока с помощью PyYAML?

One Solution collect form web for “Возможно ли сохранить структуру блока YAML при сбрасывании анализируемого документа?”

Да, это возможно с помощью pyyaml , но вам нужно предоставить свои расширенные версии, по крайней мере, сканеров, парсеров и конструкторов, которые используются safe_load, Emitter, Serializer и Representer, используемые дампом, и предоставляют специализированные строки класс, который хранит информацию об этом оригинальном форматировании.

Это часть того, что было добавлено в ruamel.yaml ( отказ от ответственности : я являюсь автором этого пакета), поскольку он был получен из PyYAML и по-прежнему поддерживает аналогичную настройку. Использование ruamel.yaml:

 import ruamel.yaml as yaml yaml_str = """\ pubkey: | -----BEGIN PUBLIC KEY----- MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2 UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK EsUgJHXcpw7OPxRrCQIDAQAB -----END PUBLIC KEY----- """ data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader) print(yaml.dump(data, Dumper=yaml.RoundTripDumper, indent=4)) 

дает тебе:

 pubkey: | -----BEGIN PUBLIC KEY----- MIGfMA0GCSq7OPxRrQEBAQUAA4GNADCBiQKBgQCvRVUKp6pr4qBEnE9lviuyfiNq QtG/OCyBDXL4Bh3FmUzfNI+Z4Bh3FmUx+z2n0FCv/4BpgHTDl8D95NPopWVo1RH2 UfhyMd6dQ/x9T5m+y38JMzmSVAk+Fqu8ya18+yQVOEyEIx3Gxpsgegow33gcxfjK EsUgJHXcpw7OPxRrCQIDAQAB -----END PUBLIC KEY----- 

по крайней мере, с Python 2.7 и 3.5.

Параметр indent=4 необходим, поскольку по умолчанию для RoundTripDumper два отступа пробела, а исходный отступ файла не сохраняется (это не облегчает повторный отступ файла YAML).

Если вы не можете переключиться на ruamel.yaml вы сможете использовать его источник, чтобы извлечь все необходимые изменения, но если вы также можете использовать его другие функции, такие как сохранение комментариев и сохранение имени слияния.

  • разрешать файлы YAML и подставлять их в шаблоны
  • Обслуживание статического html в Google app engine Python
  • Вложенные переменные jinja2
  • Может ли PyYAML сбрасывать элементы в не алфавитном порядке?
  • PyYaml, объединяющий два файла yaml
  • Как я могу создать файл yaml из чистого python?
  • Текстовые пробелы / Невидимые - Показать пробелы
  • Есть ли выигрыш в производительности от определения маршрутов в app.yaml по сравнению с одним большим отображением в WSGIApplication в AppEngine?
  •  
    Interesting Posts for Van-Lav

    Мониторинг посещенных веб-сайтов с использованием Internet Explorer, Opera, Chrome, Firefox и Safari в Python

    Топологическая сортировка Python с использованием списков, указывающих ребра

    Flake8 Не распознает встроенное исключение

    Как динамически строить объект JSON с помощью Python?

    Выполнение арифметических операций с вложенным фреймворком данных, содержащим список

    Итерации по всем парам последовательных элементов из данного списка

    Почему python добавляет «L» в конец результата больших экспонентов?

    Python ImportError: нет модуля с именем serial

    Ошибка контент-длины в тестировании конечных точек Google.

    Оператор возврата класса не печатает какой-либо вывод

    Как re.sub () необязательная совпадающая группа с использованием regex в Python?

    Как создать инкрементное имя файла в Python?

    Альтернативы сплавленного типа в цитоне

    Суммирование факториалов в Python

    Python: несогласованность в том, как вы определяете функцию __setattr__?

    Python - лучший язык программирования в мире.