如何在Python YAML文件中输出空值

2024-04-23 06:02:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在这样写yaml文件

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

这将输出:

allow: ''

我想输出为

allow:

我该怎么做?


Tags: 文件falsedefaultyamlstyleaswithopen
3条回答

如果加载YAML src

allow:

在Python中,可以将None分配给键allow,这是正确的行为。

如果您使用ruamel.yaml(我是其中的作者)及其RoundTripDumper,则None将按您的需要编写(这是IMO最可读的,尽管不是显式的):

import ruamel.yaml

print ruamel.yaml.dump(dict(allow=None), Dumper=ruamel.yaml.RoundTripDumper)

会给你:

allow:

您还可以适当地往返于此:

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))

要获取输出:

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


#### 3
<class 'ruamel.yaml.comments.CommentedMap'>

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

要从python读取None类型,请在yaml中使用null

像这样的YAML文件test.yml

foo: null
bar: null

将被python读取为

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

foo: None
bar: None
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)

有一种方法可以在python yaml本身中实现这一点。上述代码将生成一个文件,其中包含:

allow:
deny:

相关问题 更多 >