web-dev-qa-db-ja.com

python yamlファイルに空白の値を出力するにはどうすればよいですか?

私はこのようなyamlファイルを書いています

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

この出力:

allow: ''

として出力したい

allow:

どうやってやるの?

11
user3214546

YAMLsrcをロードする場合

allow:

into 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のサブクラスであり、入力のフロースタイル、行に添付されたコメントの処理、キーの順序などを追跡するために必要です。
このようなサブクラスはオンザフライで作成できますが、通常は、読み取り可能で適切にフォーマットされたYAMLコード(すでにディスクに保存されている可能性があります)から始めて、値を更新/拡張する方が簡単です。

6
Anthon
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
Hans Nelsen

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
3
Koo

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}
2
sjdenny