2017-02-15 5 views
2

私の目的は、空の可能性があるYAMLファイルにキー値のペアを挿入することです。Pythonのruamel.yamlの空のyamlファイルにキー値のペアを挿入するには?

たとえば、私のhiera.yaml(人形で使用される)ファイルにはハイフンが3つしかありません。私はそれが好きで実行しています

#!/usr/bin/python 
import ruamel.yaml 
import sys 

def read_file(f): 
    with open(f, 'r') as yaml: 
    return ruamel.yaml.round_trip_load(yaml) 

dict = {} 

dict['first_name'] = sys.argv[1] 
dict['last_name'] = sys.argv[2] 
dict['role'] = sys.argv[3] 

data = read_file('hiera.yaml') 

pos = len(data) 
data.insert(pos, sys.argv[1], dict, None) 


ruamel.yaml.round_trip_dump(data, open('hiera.yaml', 'w'), block_seq_indent=1) 

:ここ

は私のコードです

./alice.pyアリスDoeの開発

私が手のような出力:

Traceback (most recent call last): 
    File "./alice.py", line 16, in <module> 
    pos = len(data) 
TypeError: object of type 'NoneType' has no len() 

しかし、私のhiera.yamlファイルが空でない場合、例えば:

$ cat hiera.yaml 
john: 
$./alice.py Alice Doe Developer 
$ cat hiera.yaml 
john: 
alice: 
    first_name: Alice 
    last_name: Doe 
    role: Developer 

次に正しく動作します。

空のYAMLファイルにキー値のペア(私の場合はdict)を挿入する方法を教えてください。 ruamel.yaml公式ページの例では、ドキュメント文字列をサンプルYAMLコンテンツとして使用し、次にキーと値のペアを挿入します。

答えて

0

YAMLドキュメント内の空のスカラーはあなたにNoneとしてPythonにロードnull YAMLオブジェクトを与える:

a: 1 
b: 

このからロードされたデータで、キーbの値はNoneになります。

あなたのデータはruamel.yamlを使用してロードされてから、空のファイル、または空の文字列が、スカラーnullを含むファイル/文字列と同じと考えられている:

null 

あなたはそれをロードする場合、 Noneが返ってきます。新しいキーを追加することはできません。

ロードしたデータがdictまたはdictのサブクラスであることを確認してください(round_trip_loadでロードする場合、ruamel.yaml.commentが表示されます)。CommentedMap)、またはそれがNoneかどうかを確認:あなたは、通常のPythonの辞書としてCommentedMap()を使用する必要が

data = ruamel.yaml.round_trip_load(open('myfile.yaml')) 
if data is None: 
    data = ruamel.yaml.comments.CommentedMap() 
data.insert(len(data), key, value) 

は法に.insert()

を持っていません注意してくださいYAMLファイルにトップレベルのアイテムと思ったかもしれないもスカラー(文字列、整数、日時など)またはシーケンス(リストとしてロードされる)前者はおそらく.inserted()とすることはできず、後で(リスト)は.insert()

0

あなたはデータが空である可能性を正しく扱っていません。これを解決する方法は次のとおりです。try ... exceptブロックに注意してください。

import ruamel.yaml 
import sys 


def read_file(f): 
    with open(f, 'r') as yaml: 
     return ruamel.yaml.round_trip_load(yaml) 

new_dict = {} 

new_dict['first_name'] = sys.argv[1] 
new_dict['last_name'] = sys.argv[2] 
new_dict['role'] = sys.argv[3] 

data = read_file('hiera.yaml') 
try: 
    pos = len(data) 
    data.insert(pos, sys.argv[1], dict, None) 


except TypeError: 
    pass 

ruamel.yaml.round_trip_dump(new_dict, open('hiera.yaml', 'a'), 
          block_seq_indent=1) 

また、私は追加モードでファイルを開いています。さもなければ、既にそこにあれば内容は消される。

デモ時間:

$ cat hiera.yaml 
Jon: 
$ python test.py Alice Doe Developer 
cat hiera.yaml 
Jon: 
first_name: Alice 
role: Developer 
last_name: Doe 

これは、既存のデータと働きました。

$ rm hiera.yaml 
$ touch hiera.yaml 
$ python test.py Alice Doe Developer 
$ cat hiera.yaml 
first_name: Alice 
role: Developer 
last_name: Doe 
あまりにも作品

: さて、空のファイルでテストしてみましょう!

+0

のおかげでOz123&Anthonの単一のパラメータしか取らないでしょう。 – abhishek

+0

しかし、Anthonの答えは私にとってはより適切です。 – abhishek

+0

Oz123私は、追加のためにあなたの開け方を心配しています。 IMOはYAMLファイルでこれを行うべきではありません。そうした場合、ファイルをアンロード可能(YAMLが正しくない)にすることができます。 – Anthon

関連する問題