私はこのようなyamlファイルを書いています
with open(fname, "w") as f:
yaml.safe_dump({'allow':'', 'deny': ''}, f,
default_flow_style=False, width=50, indent=4)
この出力:
allow: ''
として出力したい
allow:
どうやってやるの?
YAMLsrcをロードする場合
allow:
into 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コード(すでにディスクに保存されている可能性があります)から始めて、値を更新/拡張する方が簡単です。
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:
None
タイプを読み取るにはpython yamlでnull
を使用します
YAMLファイルtest.yml
このような
foo: null
bar: null
python asとして読み取られます
import yaml
test = yaml.load(open('./test.yml'))
print(test)
foo: None
bar: None
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}