簡體   English   中英

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

[英]How can I output blank value in python yaml file

我正在寫這樣的yaml文件

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

這輸出:

allow: ''

我想輸出為

allow:

我怎樣才能做到這一點?

如果你加載一個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,處理附加到行的注釋,鍵的順序等所必需的。
這樣的子類可以動態創建,但通常更容易從一些可讀且格式良好的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:

使用replace,這似乎很簡單:

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}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM