如何在python yaml文件中输出空白值

use*_*546 6 python yaml pyyaml

我正在写这样的yaml文件

with open(fname, "w") as f:
     yaml.safe_dump({'allow':'', 'deny': ''}, f,
                    default_flow_style=False, width=50, indent=4)
Run Code Online (Sandbox Code Playgroud)

输出:

allow: ''
Run Code Online (Sandbox Code Playgroud)

我想输出为

allow:
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

Koo*_*Koo 36

对于None要从 pythonnull中读取的类型,请在 yaml 中使用

test.yml像这样的 YAML 文件

foo: null
bar: null
Run Code Online (Sandbox Code Playgroud)

将被 python 读取为

import yaml
test = yaml.load(open('./test.yml'))
print(test)

foo: None
bar: None
Run Code Online (Sandbox Code Playgroud)

  • 这是事实,但不是OP所要求的。 (2认同)

Han*_*sen 9

from yaml import SafeDumper
import yaml

data = {'deny': None, 'allow': None}

SafeDumper.add_representer(
    type(None),
    lambda dumper, value: dumper.represent_scalar(u'tag:yaml.org,2002:null', '')
  )

with open('./yadayada.yaml', 'w') as output:
  yaml.safe_dump(data, output, default_flow_style=False)
Run Code Online (Sandbox Code Playgroud)

有一种方法可以在 python yaml 本身中实现。上面的代码将生成一个包含以下内容的文件:

allow:
deny:
Run Code Online (Sandbox Code Playgroud)


Ant*_*hon 6

如果您加载YAML src

allow:
Run Code Online (Sandbox Code Playgroud)

在Python中,您将None被分配给key allow,这是正确的行为。

如果您使用ruamel.yaml(其中我的作者),它的RoundTripDumperNone是写你想要它(这是国际海事组织最可读的,虽然没有明确的):

import ruamel.yaml

print ruamel.yaml.dump(dict(allow=None), Dumper=ruamel.yaml.RoundTripDumper)
Run Code Online (Sandbox Code Playgroud)

会给你:

allow:
Run Code Online (Sandbox Code Playgroud)

您还可以适当地往返:

import ruamel.yaml

yaml_src = """
allow:
key2: Hello  # some test

"""

data = ruamel.yaml.load(yaml_src, ruamel.yaml.RoundTripLoader)
print('#### 1')
print(data['allow'])
print('#### 2')
print(ruamel.yaml.dump(data, Dumper=ruamel.yaml.RoundTripDumper))

print('#### 3')

print(type(data))
Run Code Online (Sandbox Code Playgroud)

得到作为输出:

#### 1
None
#### 2
allow:
key2: Hello  # some test


#### 3
<class 'ruamel.yaml.comments.CommentedMap'>
Run Code Online (Sandbox Code Playgroud)

在上面,data是ordereddict的子类,它是跟踪输入的流样式,处理附加到行的注释,键的顺序等所必需的。
此类子类可以动态创建,但是它是通常更容易从一些可读且格式正确的YAML代码(可能已经保存在光盘上)开始,然后更新/扩展这些值。


sjd*_*nny 6

使用替换,这看起来很简单:

import yaml

fname = 'test.yaml'
with open(fname, "w") as f:
    yaml_str = yaml.safe_dump({'allow':'', 'deny': ''},
                            default_flow_style=False,
                            width=50, 
                            indent=4).replace(r"''", '')
    f.write(yaml_str)
Run Code Online (Sandbox Code Playgroud)

您有想要避免的理由replace吗?

缺点是重新加载 yaml 文件不会重现您的输入:

>>> print yaml.safe_load(open(fname))
{'deny': None, 'allow': None}
Run Code Online (Sandbox Code Playgroud)