2015-02-06 1 views
3

Я пытаюсь использовать yaml.dump с pyyaml, чтобы преобразовать строку во что-то безопасное yaml (т. Е. Все вещи, которые необходимо экранировать, правильно экранированы). Затем я вставляю эти строки в большой документ yaml.Сериализовать строку с pyyaml ​​без эллипсинга

Вопрос заключается в том, что yaml.dump хочет рассматривать строку как весь документ, а также добавить ... (конец документа), как

In [4]: yaml.dump("a string") 
Out[4]: 'a string\n...\n' 

Как заставить его не добавлять \n...\n, не хватает только вручную удалить его? Или есть лучший способ процитировать строку для потребления ямлов с помощью pyyaml?

+0

любая причина, по которой сначала необходимо создать данные python и сбрасывать в yaml, в конце концов, вы не сработаете? – Aprillion

+1

Я создаю удобочитаемый документ yaml с комментариями. – asmeurer

ответ

3

Предоставление default_style аргумент, кажется, помогает в некоторой степени:

>>> yaml.dump("a string", default_style='"') 
'"a string"\n' 

Там также line_break аргумент, но в то время как он работает для изменения символ новой строки:

>>> yaml.dump("a string", default_style='"', line_break="\r") 
'"a string"\r' 

... он не представляется возможным удаление it:

>>> yaml.dump("a string", default_style='"', line_break="") 
'"a string"\n' 
>>> yaml.dump("a string", default_style='"', line_break=None) 
'"a string"\n' 
>>> yaml.dump("a string", default_style='"', line_break=False) 
'"a string"\n' 
2

Если вы хотите добавить что-то в документ yaml, содержащий комментарии, вы должны посмотреть на ruamel.yaml (из которых я являюсь автором). Это расширение PyYAML, которое сохраняет комментарии в файле YAML.

Таким образом, если вы хотите что-то добавить к последовательности в этом input.yml файле:

- alpha # first one 
- beta # another one 

вы можете просто сделать:

# coding: utf-8 

import ruamel.yaml 

file_name = 'input.yml' 

config = ruamel.yaml.load(open(file_name), ruamel.yaml.RoundTripLoader) 
config.append('ω') 

ruamel.yaml.dump(config, open('output.yml', 'w'), 
       Dumper=ruamel.yaml.RoundTripDumper) 
ruamel.yaml.dump(config, open('unicode.yml', 'w'), allow_unicode=True, 
       Dumper=ruamel.yaml.RoundTripDumper) 

и получить в output.yml (с тем, что я думаю, что вы называете надлежащее выгорание):

- alpha # first one 
- beta # another one 
- "\u03C9" 

и unicode.yml:

- alpha # first one 
- beta # another one 
- ω 

Обратите внимание, что комментарии сохранены, например, например. PyYAML не делает. Возможно добавление комментария к добавленному элементу.

+0

О, Боже мой! Кто-нибудь, наконец, написал партизан yaml с округлым отключением для Python? Я определенно собираюсь это проверить. – asmeurer

+0

@asmeurer Да кто-то наконец сделал ;-). Несколько месяцев назад на самом деле, я только теперь собрался, чтобы переместиться на пиамский тег на [so] и посмотреть, могут ли быть добавлены некоторые ответы или существующие из них. Если что-то не работает, сообщите об ошибке (с примером) на [bitbucket] (https://bitbucket.org/ruamel/yaml) – Anthon