2016-05-10 6 views
1

私は自分のゲームに別の "選手"を保存するYAMLファイルを持っています。YAMLでPythonを使う

YAMLファイルは次のようになります。私はYAMLファイルは次のようになりますプレーヤーを作成した後

Person: 
    Name: 
    Age: 
    Nationality: 
    Footed: 
    Position: 

Person: 
    Name: Rich 
    Age: 23 
    Nationality: British 
    Footed: Right 
    Position: Forward 

これまでのところ、私のコードは次のようである:

import yaml 

name = input('What is your name? ') 
age = int(input('What is your age? ')) 
nationality = input('What is your nationality? ') 
footed = input('What foot? ') 
position = input('What is your position? ') 

with open('test.yml', 'a') as outfile: 
    outfile.write(yaml.dump({'Name' : name, 'Age' : age, 'Nationality' : nationality, 
    'Footed' : footed, 'Position' : position})) 

これを実行してユーザー入力を与えると、yamlファイルは次のようになります。

{Age: 2, Footed: r, Name: r, Nationality: r, Position: r} 

追加するのではなくYAMLファイルに追加するにはどうしたらいいですか、また水平ではなく垂直にどのように構造化するのですか?私は選手たちの10月20日/ nの数を追加したい場合は最後に、私はそれぞれを個別に

+0

PyYAMLのみ(主に)は2005年からYAML 1.1標準をサポートしています。2009年以来、最新のYAMLバージョンは1です。2 – Anthon

答えて

1

あなたがそうであるように、あなたのYAMLを書き出すときに、あなたが最初に書く:あなたはこのように行うことができます

with open('test.yml', 'w') as outfile: 
    outfile.write(yaml.dump(
     {"Person": { 
     'Name' : name, 
     'Age' : age, 
     'Nationality' : nationality, 
     'Footed' : footed, 
     'Position' : position} 
     }, 
     default_flow_style=False)) 

出力

Person: 
    Name: Rich 
    Age: 23 
    Nationality: British 
    Footed: Right 
    Position: Forward 
+0

'ruamel.yaml'はまだ使用していませんが、' File "yaml_example.py"の8行目の上の実装でこのエラーが発生しています person = data ['Person'] TypeError: 'NoneType'オブジェクトはサブスクリプトではありません.' – NewUser123

+0

PyYAMLとruamel.yamlの両方のバージョンでは、私にはあなたの名前は何ですか?あなたの 'test.yml'が空であるかもしれないか確認してください。 – Anthon

+0

これはyamlファイルに貼り付けられますが、 'test.yml ... 'はもちろん正しくありません。 – NewUser123

0
  • オープン"w"を使用して、ファイルではなく、呼び出すことができるように、それらを互いに下にあるすべてのものを格納するためのYAMLファイルを希望します"a"
  • Personも書き込む必要があります。
  • オプションdefault_flow_style=Falseを使用してください。

コード:

import pyaml as yaml 

name = input('What is your name? ') 
age = int(input('What is your age? ')) 
nationality = input('What is your nationality? ') 
footed = input('What foot? ') 
position = input('What is your position? ') 

person = {'Person':{ 
       'Name': name, 
       'Age': age, 
       'Nationality': nationality, 
       'Footed': footed, 
       'Position': position} 
     } 

with open('test.yml', 'a') as outfile: 
    yaml.dump(person, outfile, indent=4) 
0

データ構造体をメモリ内のファイルに追加した後、メモリファイルの内容を文字列として取得し、wそれをファイルに書き込む。それは非効率的で遅いです。

あなたはまた、あなたが持っているYAMLファイルを読み込む必要があり、データ構造を更新し、それをダンプ:

import yaml 

file_name = 'test.yml' 

with open(file_name) as infile: 
    data = yaml.load(infile) 

person = data['Person'] 
person['name'] = input('What is your name? ') 
person['age'] = int(input('What is your age? ')) 
person['nationality'] = input('What is your nationality? ') 
person['footed'] = input('What foot? ') 
person['position'] = input('What is your position? ') 

with open(file_name, 'w') as outfile: 
    yaml.dump(data, stream=outfile, default_flow_style=False, indent=3) 

default_flow_styleパラメータは、あなたのキーと値のペアがお互いの下に表示されているか確認します。

PyYAMLでは、infile内のコメントは失われ、マッピング内のキーの順序はおそらくスクランブルされます。それが問題であるならば、私はあなたが(免責事項:私はそのパッケージの作者午前)ruamel.yamlパッケージを使用することをお勧めします、とにコードを変更する:あなたは複数のプレイヤーを保存したい場合は

import ruamel.yaml 

file_name = 'test.yml' 

with open(file_name) as infile: 
    data = ruamel.yaml.round_trip_load(infile) 

person = data['Person'] 
person['name'] = input('What is your name? ') 
person['age'] = int(input('What is your age? ')) 
person['nationality'] = input('What is your nationality? ') 
person['footed'] = input('What foot? ') 
person['position'] = input('What is your position? ') 

with open(file_name, 'w') as outfile: 
    yaml.round_trip_dump(data, stream=outfile, indent=3) 

。トップレベルのデータ構造がシーケンスであることを確認するか、独自の値(例:Personの名前)からマッピングしてください。その場合、テンプレートとして別の入力ファイルを使用し、出力ファイルを読み込み、リストcqに追加して更新します。 dictを更新してファイルを書き出します。名前が一意である限り、トップレベルのマッピング/ dictでこれを行う方が簡単です。

関連する問題