2015-04-14 35 views
1

我有一个yaml文档,如下所示。如何使用' n'转储python字典以输出纯文本

doc=""" 
... network-interface: > 
... auto $(intf) 
...  iface $(intf) inet static 
...  address $(addr) 
...  network $(net) 
...  netmask $(mask) 
... """ 

我正在加载这个文档并得到一个python字典。我试图将这个文档转换回我的原始文档,我得到'\n'字符。

ydict = yaml.load(doc) 
ndoc = yaml.dump(ydict) 
print ndoc 
{network-interface: "auto $(intf)\n iface $(intf) inet static\n address $(addr)\n\ 
    \ network $(net)\n netmask $(mask)\n"} 

print yaml.dump(ydict, default_flow_style=False) 
network-interface: "auto $(intf)\n iface $(intf) inet static\n address $(addr)\n\ 
    \ network $(net)\n netmask $(mask)\n" 

如何在没有'\n'的情况下获得原始文档。

+0

http://stackoverflow.com/questions/18514205/how-to-prevent-yaml-to-dump-long-line-without-new-line –

+1

的可能重复好,如果它会将它转储回YAML格式,您需要那些'\ n'字符吗?当你将它流入一个文件并用vim或类似文件打开它时,它实际上看起来如何? –

回答

0

您指定的字符串为folded block style,但在以'iface`开头的行上添加了一个缩进符号,因此会导致'hard'换行符。

如果你对准那些行:

import yaml 

doc=""" 
network-interface: > 
     auto $(intf) 
     iface $(intf) inet static 
     address $(addr) 
     network $(net) 
     netmask $(mask) 
""" 

ydict = ruamel.yaml.load(doc, Loader=ruamel.yaml.RoundTripLoader) 
ndoc = ruamel.yaml.dump(ydict, Dumper=ruamel.yaml.RoundTripDumper) 
ydict = ruamel.yaml.load(doc) 
ndoc = ruamel.yaml.dump(ydict) 

print ndoc 

您将获得:

{network-interface: 'auto $(intf) iface $(intf) inet static address $(addr) network 
    $(net) netmask $(mask) 

    '} 

如果你希望你的输出YAML更紧密地像你的输入,你应该考虑使用ruamel.yaml(其中我是作者)并使用literal style|):

import ruamel.yaml 

doc=""" 
network-interface: | 
     auto $(intf) 
     iface $(intf) inet static 
     address $(addr) 
     network $(net) 
     netmask $(mask) 
""" 

ydict = ruamel.yaml.load(doc, Loader=ruamel.yaml.RoundTripLoader) 
ndoc = ruamel.yaml.dump(ydict, Dumper=ruamel.yaml.RoundTripDumper) 

print ndoc 

为您提供:

network-interface: | 
    auto $(intf) 
    iface $(intf) inet static 
    address $(addr) 
    network $(net) 
    netmask $(mask)