【问题标题】:How can I output blank value in python yaml file如何在 python yaml 文件中输出空白值
【发布时间】: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 ''),所以我只想创建这样的文件,这样如果我想写点东西那么我不需要删除那些不需要的字符

标签: python yaml pyyaml


【解决方案1】:

如果你加载一个 YAML src

allow:

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

如果您使用ruamel.yaml(我是其作者),并且它的RoundTripDumperNone 是按照您的意愿编写的(这是 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 要求的。
      猜你喜欢
      • 1970-01-01
      • 2017-07-03
      • 2014-03-21
      • 1970-01-01
      • 2023-03-08
      • 2020-04-28
      • 2012-02-12
      • 1970-01-01
      • 2019-12-02
      相关资源
      最近更新 更多