[英]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.