如何在 python yaml 文件中输出空白值
Posted
技术标签:
【中文标题】如何在 python yaml 文件中输出空白值【英文标题】:How can I output blank value in python yaml file 【发布时间】:2015-07-19 23:26:09 【问题描述】:我正在写这样的yaml文件
with open(fname, "w") as f:
yaml.safe_dump('allow':'', 'deny': '', f,
default_flow_style=False, width=50, indent=4)
这个输出:
allow: ''
我想输出为
allow:
我该怎么做?
【问题讨论】:
您基本上是想将其设置为 null 而不是空字符串? 您在问如何保存与实际数据不同的值?为什么?如果实际数据是空字符串,那么该数据的 yaml 表示也应该是空字符串,不是吗?您是否尝试将原始值设置为None
?
@BryanOakley ,如果我放 None ,那么它在 yaml 中显示 null 。我想保持空白。我是硬编码值。我正在寻找可以在实际值中使用的变量来提供空白输出,例如 null , None 等。我不想使用替换
在 YAML 中,一个空值被解释为 null,那么有什么区别呢?只需使用None
。它会以同样的方式被解释。当然,除非有一些非常具体的原因需要它为空白,无论它是如何解释的。在这种情况下,您可能想让我们知道,以便我们提供帮助。也许知道您请求的上下文,有人可能会建议一种不同的方式来获得您想要的东西。
@Waylan 在我看到的所有 yaml 文件中,if 键通常为空,而不是(null or None or '')
,所以我只想创建这样的文件,这样如果我想写点东西那么我不需要删除那些不需要的字符
【参考方案1】:
如果你加载一个 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 的子类,它是跟踪输入的flowstyle、处理附加到行的cmets、键的顺序等所必需的。
这样的子类可以即时创建,但通常更容易从一些可读且格式良好的 YAML 代码开始(可能已经保存在磁盘上),然后更新/扩展这些值。
【讨论】:
【参考方案2】:使用替换,这看起来很简单:
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)
你有什么理由要避开replace
?
有一个缺点是重新加载 yaml 文件不会重现您的输入:
>>> print yaml.safe_load(open(fname))
'deny': None, 'allow': None
【讨论】:
【参考方案3】: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:
【讨论】:
我认为这应该是正确的答案。似乎是最干净的解决方案,可以通过库的适当内部结构适当地解决这个问题。 完美!你拯救了我的一天【参考方案4】:对于要从 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
【讨论】:
这是真的,但不是 OP 要求的。以上是关于如何在 python yaml 文件中输出空白值的主要内容,如果未能解决你的问题,请参考以下文章
python - 在Python中使用Dictwriter输出时,为啥CSV文件在每个数据行之间包含一个空白行[重复]