**1. PyYAML **をインストールします
pip install PyYAML
2. yamlファイルをロード
yaml.load()関数を直接使用します
demo.yml :
kind: Deployment
apiVersion: apps/v1
metadata:
name: podinfo
namespace: yaml-demo
spec:
replicas:1
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:- name: podinfod
image: quay.io/stefanprodan/podinfo:0.3.0
ports:- containerPort:9898
load.py :
import yaml
import json
result = yaml.load(open('demo.yml'))
print json.dumps(result, indent=2)
出力:
{" kind":"Deployment","spec":{"replicas":1,"template":{"spec":{"containers":[{"image":"quay.io/stefanprodan/podinfo:0.3.0","name":"podinfod","ports":[{"containerPort":9898}]}]},"metadata":{"labels":{"app":"podinfo"}}},"selector":{"matchLabels":{"app":"podinfo"}}},"apiVersion":"apps/v1","metadata":{"namespace":"yaml-demo","name":"podinfo"}}
3. dictをymlファイルに永続化
yaml.safe_dump()関数を使用します
dump.py :
import yaml
d ={"kind":"Deployment","spec":{"replicas":1,"template":{"spec":{"containers":[{"image":"quay.io/stefanprodan/podinfo:0.3.0","name":"podinfod","ports":[{"containerPort":9898}]}]},"metadata":{"labels":{"app":"podinfo"}}},"selector":{"matchLabels":{"app":"podinfo"}}},"apiVersion":"apps/v1","metadata":{"namespace":"yaml-demo","name":"podinfo"}}
result = yaml.safe_dump(d, encoding='utf-8', allow_unicode=True, default_flow_style=False)open('demo.yml','w').write(result)
demo.yml :
apiVersion: apps/v1
kind: Deployment
metadata:
name: podinfo
namespace: yaml-demo
spec:
replicas:1
selector:
matchLabels:
app: podinfo
template:
metadata:
labels:
app: podinfo
spec:
containers:- image: quay.io/stefanprodan/podinfo:0.3.0
name: podinfod
ports:- containerPort:9898
補足知識:PythonのPyYAMLモジュールの詳細な説明
前書き
PythonのPyYAMLモジュールは、PythonのYAMLパーサーおよびジェネレーターです。
インストール
簡単なインストール
pip install pyyaml
ソースからインストール
ソースパッケージPyYAML-3.13.tar.gzをダウンロードして解凍し、コマンドラインの下で解凍されたパッケージディレクトリに切り替えて、次のコマンドを実行します。
python setup.py install
純粋なPythonバージョンよりも高速にLibYAMLバインディングを使用する場合は、最初にLibYAMLをダウンロードしてインストールしてから、PyYAMLをインストールするときに次のコマンドを実行する必要があります。
python setup.py –with-libyaml install
LibYAMLベースのパーサーとジェネレーターを使用するには、CParserクラスとCEmitterクラスを使用してください。例えば:
from yaml import load, dump
try:from yaml import Cloader as Loader, CDumper as Dumper
except ImportError:from yaml import Loader, Dumper
# ...
data =load(stream, Loader=Loader)
# ...
output =dump(data, Dumper=Dumper)
純粋なPythonとLibYAMLに基づくYAMLパーサーとジェネレーターの間には、微妙ではありますがそれほど重要ではない違いがあることに注意してください。
最もよくある質問
以下に示すYAMLドキュメントが逆シリアル化後にシリアル化され、結果のYAMLドキュメントの形式が元の形式と異なるのはなぜですか?
import yaml
document ="""
a:1
b:
c:3
d:4"""
print(yaml.dump(yaml.load(document)))
その中で、上記のコードの出力は次のとおりです。
a: 1
b: {c: 3, d: 4}
この問題に関しては、実際、最終的なYAMLドキュメントのスタイルは元のドキュメントのスタイルと一致していませんが、正しい結果です。
PyYAMLはデフォルトで、コレクションにネストされたコレクションがあるかどうかに基づいて、コレクションを表すために使用する形式を決定するためです。コレクションが他のコレクションとネストされている場合は、ブロックスタイルで表されます。それ以外の場合は、フロースタイルで表されます。
コレクションを常にブロックスタイルで表現する場合は、次に示すように、dump()メソッドのdefault_flow_styleパラメーター値をFalseに設定できます。
print(yaml.dump(yaml.load(document), default_flow_style=False))
上記のコードの出力は次のとおりです。
a: 1
b:
c: 3
d: 4
詳細な使用法
最初にyamlモジュールをインポートします。
import yaml
YAMLをロード
警告:信頼できないソースから受信したデータを処理するためにyaml.loadを呼び出すのは危険な場合があります。 yaml.loadはpickle.loadと同じくらい強力で、すべてのPython関数を呼び出すことができます。
yaml.loadの関数は、YAMLドキュメントをPythonオブジェクトに変換するために使用されます。次のように:
yaml.load("""
...- Hesperiidae
...- Papilionidae
...- Apatelodidae
...- Epiplemidae
...""")[' Hesperiidae','Papilionidae','Apatelodidae','Epiplemidae']
yaml.load関数は、YAMLドキュメントを表すバイト文字列、Unicode文字列、開いたバイナリファイルオブジェクト、または開いたテキストファイルオブジェクトをパラメータとして受け入れることができます。パラメータがバイト文字列またはファイルの場合、utf-8、utf-16、またはutf-16-leエンコーディングを使用する必要があります。 yaml.loadは、バイト文字列またはファイルオブジェクトのBOM(バイトオーダーマーク)をチェックし、それに応じてそれらのエンコード形式を決定します。 BOMが見つからない場合は、utf-8形式のエンコーディングを使用していると見なされます。
以下に示すように、yaml.loadメソッドの戻り値はPythonオブジェクトです。
yaml.load("'hello': ''"){'hello':'\uf8ff'}withopen('document.yaml','w')as f:... f.writelines('- Python\n- Ruby\n- Java')...
stream =open('document.yaml')
yaml.load(stream)['Python','Ruby','Java']
文字列またはファイルに複数のYAMLドキュメントが含まれている場合は、yaml.load_all関数を使用してそれらすべてを逆シリアル化できます。その結果、逆シリアル化されたすべてのYAMLドキュメントを含むジェネレータオブジェクトが作成されます。
documents ="""
... name: bob
... age:18...---... name: alex
... age:20...---... name: jason
... age:16..."""
datas = yaml.load_all(documents)
datas
< generator object load_all at 0x105682228for data in datas:...print(data)...{'name':'bob','age':18}{'name':'alex','age':20}{'name':'jason','age':16}
PyYAMLを使用すると、ユーザーは次のように任意のタイプのPythonオブジェクトを作成できます。
document ="""
... none:[~,null]... bool:[true,false, on, off]... int:55... float:3.1415926... list:[Red, Blue, Green, Black]... dict:{name: bob, age:18}..."""
yaml.load(document){'none':[None, None],'bool':[True, False, True, False],'int':55,'float':3.1415926,'list':['Red','Blue','Green','Black'],'dict':{'name':'bob','age':18}}
以下に示すように、Pythonクラスのインスタンスでさえ、タグ!! python / objectを使用して構築できます。
classPerson:... def __init__(self, name, age, gender):... self.name = name
... self.age = age
... self.gender = gender
... def __repr__(self):...return f"{self.__class__.__name__}(name={self.name!r}, age={self.age!r}, gender={self.gender!r})"...
yaml.load("""
...!! python/object:__main__.Person
... name: Bob
... age:18... gender: Male
...""") Person(name='Bob', age=18, gender='Male')
信頼できないソース(インターネットなど)からYAMLドキュメントを受け取り、そこから任意のPythonオブジェクトを作成すると、特定のリスクが発生する可能性があることに注意してください。 yaml.safe_loadメソッドを使用すると、この動作を、整数やリストなどの単純なPythonオブジェクトの作成のみに制限できます。
yaml.YAMLObjectクラスから継承するサブクラスを定義し、このサブクラスのクラス属性yaml_loaderの値をyaml.SafeLoaderに設定して、このクラスのオブジェクトが安全としてマークされ、yaml.safe_loadメソッドで使用できるようにします。認識。ただし、このようなPythonオブジェクトを逆シリアル化する場合は、safe_loadメソッドとsafe_load_allメソッドしか使用できないことに注意してください。
YAMLをダンプ
yaml.dump関数はPythonオブジェクトを受け入れ、YAMLドキュメントを生成します。
import yaml
emp_info ={'name':'Lex',...'department':'SQA',...'salary':8000,...'annual leave entitlement':[5,10]...}print(yaml.dump(emp_info))
annual leave entitlement:[5,10]
department: SQA
name: Lex
salary:8000
yaml.dumpは、生成されたYAMLテキストを書き込むための2番目のオプションのパラメーターを受け入れることができます。このパラメーターの値は、オープンテキストまたはバイナリファイルオブジェクトにすることができます。このオプションのパラメーターが指定されていない場合、生成されたYAMLドキュメントが直接返されます。
withopen('document.yaml','w')as f:... yaml.dump(emp_info, f)...import os
os.system('cat document.yaml')
annual leave entitlement:[5,10]
department: SQA
name: Lex
salary:80000
複数のPythonオブジェクトをYAMLストリームにシリアル化する場合は、yaml.dump_all関数を使用できます。この関数は、シリアル化される複数のPythonオブジェクトを表す、最初のパラメーターとしてPythonリストまたはジェネレーターオブジェクトを受け入れます。
obj =[{'name':'bob','age':19},{'name':20,'age':23},{'name':'leo','age':25}]print(yaml.dump_all(obj)){age:19, name: bob}---{age:23, name:20}---{age:25, name: leo}
次のように、Pythonクラスのインスタンスをシリアル化することもできます。
classPerson:... def __init__(self, name, age, gender):... self.name = name
... self.age = age
... self.gender = gender
... def __repr__(self):...return f"{self.__class__.__name__}(name={self.name!r}, age={self.age!r}, gender={self.gender!r})"...print(yaml.dump(Person('Lucy',26,'Female')))!!python/object:__main__.Person {age:26, gender: Female, name: Lucy}
yaml.dumpメソッドとyaml.dump_allメソッドは、生成されたYAMLストリーム内のYAMLドキュメントのスタイルと、他の情報が含まれているかどうかを指定するための複数のキーワードパラメーターもサポートします。以下に、各パラメータの意味と使い方を詳しく紹介します。
stream
出力YAMLストリームのために開くファイルオブジェクトを指定します。デフォルト値はNoneです。これは、関数の戻り値として戻ることを意味します。
default_flow_style
デフォルトでシーケンスとマッピングをフロースタイルで表示するかどうか。デフォルト値はNoneです。これは、ネストされたコレクションを含まないYAMLフローにフロースタイルが使用されることを意味します。 Trueに設定すると、シーケンスとマップはブロックスタイルを使用します。
default_style
デフォルト値はNoneです。スカラーが引用符で囲まれていないことを示します。 '”'に設定すると、すべてのスカラーが二重引用符で囲まれることを意味します。“ '”に設定すると、すべてのスカラーが一重引用符で囲まれることを意味します。
canonical
YAMLドキュメントを正規の形式で表示するかどうか。デフォルト値はNoneです。これは、正規の形式を使用する代わりに、他のキーワードパラメーターによって設定された値でフォーマットすることを意味します。 Trueに設定すると、YAMLドキュメントのコンテンツが正規の形式で表示されます。
indent
インデントレベルを示します。デフォルト値はNoneです。これは、他の整数に設定できるデフォルトのインデントレベル(2つのスペース)を使用することを意味します。
width
各線の最大幅を示します。デフォルト値はNoneです。これは、デフォルトの幅80が使用されることを意味します。
allow_unicode
YAMLストリームでユニコード文字を許可するかどうか。デフォルト値はFalseで、ユニコード文字をエスケープします。 Trueに設定すると、ユニコード文字はYAMLドキュメントに通常どおり表示され、エスケープされません。
line_break
改行を設定します。デフォルト値はNoneです。これは、新しい行の文字が "で、空であることを意味します。\ n、\ r、または\ r \ nに設定できます。
encoding
指定されたエンコーディングを使用してYAMLストリームをエンコードし、バイト文字列として出力します。デフォルト値はNoneです。これは、エンコードが実行されず、出力が一般的な文字列であることを意味します。
explicit_start
各YAMLドキュメントには、明示的なコマンド終了タグが含まれていますか?デフォルト値はNoneです。これは、ストリームにYAMLドキュメントが1つしかない場合、明示的なコマンド終了タグが含まれないことを意味します。 Trueに設定すると、YAMLストリーム内のすべてのYAMLドキュメントに明示的なコマンド終了タグが含まれます。
explicit_end
各YAMLドキュメントに明示的なドキュメントの終わりタグが含まれているかどうか。デフォルト値はNoneです。これは、ストリーム内のYAMLドキュメントに明示的なドキュメントの終わりタグが含まれていないことを意味します。 Trueに設定すると、YAMLストリーム内のすべてのYAMLドキュメントに明示的なドキュメントの終わりタグが含まれます。
version
YAMLドキュメントでYAMLバージョン番号を指定するために使用されます。デフォルト値はNoneです。これは、バージョン番号がYAMLで指定されていないことを意味します。 2つの要素を含むタプルまたはリストに設定できますが、最初の要素は1でなければなりません。そうでない場合、例外が発生します。現在利用可能なYAMLバージョン番号は1.0、1.1、および1.2です。
tags
YAMLドキュメントに含めるタグを指定するために使用されます。デフォルト値はNoneです。これは、ラベル命令が指定されていないことを意味します。タグを含む辞書として設定できます。辞書内のキーと値のペアは、さまざまなタグの名前と値に対応しています。
data ={'code':200,'status':'success','message':[10, True,"Got it"]}print(yaml.dump(data, version=(1,2))) #YAMLバージョンを設定する
%YAML 1.2---
code:200
message:[10,true, Got it]
status: success
print(yaml.dump(data, version=(1,2), tags={'!name!':'test'})) #ラベルの説明を設定する
%YAML 1.2%TAG !name! test
---
code:200
message:[10,true, Got it]
status: success
print(yaml.dump(data, #ブロックスタイルを使用するように設定
... version=(1,2),... tags={'!name!':'test'},... default_flow_style=False))%YAML 1.2%TAG !name! test
---
code:200
message:-10-true- Got it
status: success
print(yaml.dump(data, #一重引用符を使用するようにスカラーを設定します
... version=(1,2),... tags={'!name!':'test'},... default_flow_style=False,... default_style="'"))%YAML 1.2%TAG !name! test
- - - ' code':!!int '200''message':-!!int '10'-!!bool 'true'-'Got it''status':'success'print(yaml.dump(data, #二重引用符を使用するようにスカラーを設定します
... version=(1,2),... tags={'!name!':'test'},... default_flow_style=False,... default_style='"'))%YAML 1.2%TAG !name! test
- - - " code":!!int "200""message":-!!int "10"-!!bool "true"-"Got it""status":"success"print(yaml.dump(data, #明示的な命令終了タグとドキュメント終了タグを含めるようにYAMLドキュメントを設定します
... explicit_start=True,... explicit_end=True))---
code:200
message:[10,true, Got it]
status: success
... print(yaml.dump(data, canonical=True)) #ドキュメント使用仕様書の設定
- - - !! map {?!!str "code":!!int "200",?!!str "message":!!seq [!!int "10",!!bool "true",!!str "Got it",],?!!str "status":!!str "success",}print(yaml.dump(data, encoding='utf-8')) #YAMLストリームにutfを使用する-エンコード用の8フォーマット
b'code: 200\nmessage: [10, true, Got it]\nstatus: success\n'
user_info ={'name':'ジャッキー・チャン','age':57,'ニックネーム':['歌の神','Ufly']}print(yaml.dump(user_info)) #許可を設定しない場合_ユニコードパラメータ、ユニコード文字はエスケープされます
age:57
name:"\u5F20\u5B66\u53CB""\u5916\u53F7":["\u6B4C\u795E","\u4E4C\u8747\u54E5"]print(yaml.dump(user_info, allow_unicode=True)) #ユニコード文字を許可するように設定
age:57
name:ジャッキー・チャン
ニックネーム:[歌の神,Ufly]
構築、表現、分析
独自のアプリケーション固有のタグを定義できます。最も簡単な方法は、yaml.YAMLObjectのサブクラスを次のように定義することです。
classPerson(yaml.YAMLObject):... yaml_tag ='!Person'... def __init__(self, name, age, gender):... self.name = name
... self.age = age
... self.gender = gender
... def __repr__(self):...return f"{self.__class__.__name__}(name={self.name!r}, age={self.age!r}, gender={self.gender!r})"...
上記の定義は、Personオブジェクトの逆シリアル化とシリアル化を自動化するのに十分です。
text ="""
...- - - ! Person
... name: Bob
... age:22... gender: Male
..."""
yaml.load(text)Person(name='Bob', age=22, gender='Male')print(yaml.dump(Person('Bob',22,'Male')))!Person {age:22, gender: Male, name: Bob}
yaml.YAMLObjectは、メタクラスマジックを使用して、YAMLノードをクラスインスタンスに変換するために使用されるコンストラクターと、YAMLノードをPythonクラスインスタンスに逆シリアル化するために使用されるプレゼンターを登録します。
メタクラスを使用したくない場合は、yaml.add_constructorとyaml.add_representerを使用して、コンストラクターとリプレッサーを登録できます。次のように:
classDice(tuple):... def __new__(cls, a, b):...return tuple.__new__(cls,[a, b])... def __repr__(self):...return'Dice(%s, %s)'% self
... print(Dice(3,6))Dice(3,6)
デフォルトのDiceオブジェクトの表現はきれいに見えません:
print(yaml.dump(Dice(3,6)))!!python/object/new:__main__.Dice
- !! python/tuple [3,6]
次に、Diceオブジェクトをシリアル化してAdBとして表現したいとします。
print(yaml.dump(Dict(3、6)))#期待される出力:3d6
まず、以下に示すように、Dictオブジェクトを!dictタグでマークされたスカラーノードに変換するために使用される* representersを定義し、それを登録する必要があります。
def dice_representer(dumper, data):...return dumper.represent_scalar('!dice','%sd%s'% data)...
yaml.add_representer(Dice, dice_representer)
これで、Diceオブジェクトのインスタンスをシリアル化した後の入力は期待どおりです。
yaml.add_representer(Dice, dice_representer)print(yaml.dump({'gold':Dice(10,6)})){gold:!dice '10d6'}
次に、!diceタグでマークされたスカラーノードをDiceオブジェクトに変換して登録するコンストラクターを実装しましょう。
def dice_constructor(loader, node):... value = loader.construct_scalar(node)... a, b =map(int, value.split('d'))...returnDice(a, b)...
yaml.add_constructor('!dice', dice_constructor)
次に、Diceオブジェクトをロードできます。
text ='initial hit points: !dice 8d4'print(yaml.load(text)){'initial hit points':Dice(8,4)}
!diceラベルをどこにも指定したくない場合は、add_implicit_resolver関数を使用して、以下に示すように、XdYなどのラベルのない通常のスカラーすべてに明示的なラベル!diceがあることをPyYAMLに通知できます。
import re
pattern = re.compile(r'^\d+d\d+$')
yaml.add_implicit_resolver('!dice', pattern)
以下に示すように、Diceオブジェクトを定義するときにタグを使用する必要はありません。
print(yaml.dump({'treasure':Dice(10,20)})){treasure: 10d20}print(yaml.load('damage: 5d10')){'damage':Dice(5,10)}
オブジェクトを安全としてマークする場合、そのようなオブジェクトを逆シリアル化するときにのみsafe_loadまたはsafe_load_allメソッドを使用できます。そうしないと、以下に示すようにエラーが報告されます。
classPerson(yaml.YAMLObject):... yaml_tag ='!Person'... yaml_loader = yaml.SafeLoader
... def __init(self, name, age, gender):... self.name = name
... self.age = age
... self.gender = gender
... def __repr__(self):...return f"Person(name={self.name!r}, age={self.age!r}, gender={self.gender!r})"...
text ="""
...! Person
... name: Bob
... age:22... gender: Male
..."""
yaml.load(text) #安全に使用しないでください_ロードまたは安全_load_すべてのメソッドがエラーを報告します
Traceback(most recent call last):...
yaml.constructor.ConstructorError: could not determine a constructor for the tag '!Person'in"<unicode string ", line 2, column 1:!Person
^
yaml.safe_load(text) #安全に使用する_loadメソッドは通常どおり逆シリアル化できます
Person(name='Bob', age=22, gender='Male')
YAML構文
このパートでは、最も一般的なYAML構造と対応するPythonオブジェクトを紹介します。
ドキュメンテーション
YAMLストリームは、0個以上のYAMLドキュメントのコレクションです。空のYAMLストリームにはYAMLドキュメントが含まれていません。 YAMLドキュメントは、ドキュメント開始タグで区切られています—。 YAMLドキュメントには、オプションのドキュメントの終わりタグを含めることができます。ストリームにドキュメントが1つしかない場合は、ドキュメント開始タグを使用できません。ドキュメント開始タグを含むドキュメントは明示的ドキュメントと呼ぶことができ、ドキュメント開始タグを含まないドキュメントは暗黙的ドキュメントと呼ぶことができます。
これが暗黙のドキュメントです:
– Multimedia
– Internet
– Education
明示的なドキュメントは次のとおりです。
—
– Afterstep
– CTWM
– Oroborus
…
複数のドキュメントを含むYAMLストリームは次のとおりです。
—
– Employee
– Manager
– CEO
– CTO
—
– Student
—
– C
-C ## YAMLで「#」を使用してコメントを示します(「#」の前のスペース)
– C++
– Cold Fusion
ブロックシーケンス
ブロックコンテンツでは、ダッシュ(ダッシュ)を使用し、その後にスペース(スペース)を使用して、シーケンス内のアイテムを示します。
これは、一連のブロックを含むドキュメントです。
– id
– name
– age
上記のドキュメントは、Pythonオブジェクトを次のように表しています。
[ ‘id’, ‘name’, ‘age’]
ブロックシーケンスはネストできます:
–
– Python
– Ruby
– JavaScript
– PHP
–
– Unix
– Linux
– Windows
上記のドキュメントは、次のPythonオブジェクトを表しています。
[[ ‘Python’, ‘Ruby’, ‘JavaScript’, ‘PHP’], [‘Unix’, ‘Linux’, ‘Windows’]]
ネストされたブロックシーケンスでは、以下に示すように、新しい行から開始しなくても、内部シーケンスを現在の行から直接開始できます。
– – Python
– Ruby
– JavaScript
– PHP
– – Unix
– Linux
– Windows
ブロックシーケンスは、ブロックマップにネストできます。この場合、以下に示すように、ブロックシーケンスをインデントする必要はありません。
Programing Languages:
– Java
– Swift
– C++
– Go
Operation System:
– Unix
– Linux
– Windows
– OSX
上記のドキュメントは、次のPythonオブジェクトを表しています。
{' Programing Languages':['Java','Swift','C++','Go'],'Operation System':['Unix','Linux','Windows']}
ブロックマッピング
ブロックコンテンツでは、コロンを使用します。その後にスペースを使用して、マップ内のキーと値を区切ります。
name: bob
age:28
gender: Male
上記のドキュメントは、次のPythonオブジェクトを表しています。
{ ‘name’: ‘bob’, ‘age’: 28, ‘gender’: ‘Male’}
以下に示すように、複雑なキーは疑問符?とそれに続くスペースで表されます。
?!! python/tuple [0,0]: Start
?!! python/tuple [3,5]: End
上記のドキュメントは、次のPythonオブジェクトを表しています。
{(0, 0): ‘Start’, (3, 5): ‘End’}
以下に示すように、ブロックマッピングはネストできます。
Employee:
Job_title: Employee
Salary:5000
Annual Leave:10
Manager:
Job_title: Manager
Salary:8000
Annual Leave:15
上記のドキュメントは、次のPythonオブジェクトを表しています。
{ ‘Employee’: {‘Job_title’: ‘Employee’, ‘Salary’: 5000, ‘Annual Leave’: 10},
‘Manager’: {‘ Job_title’: ‘Manager’, ‘Salary’: 8000, ‘Annual Leave’: 15}}
ブロックマッピングは、次のように一連のブロックにネストできます。
– name: PyYAML
status: 4
license: MIT
language: Python
– name: PySyck
status: 5
license: BSD
language: Python
上記のドキュメントは、次のPythonオブジェクトを表しています。
[{ ‘name’: ‘PyYAML’, ‘status’: 4, ‘license’: ‘MIT’, ‘language’: ‘Python’},
{ ‘name’: ‘PySyck’, ‘status’: 5, ‘license’: ‘BSD’, ‘language’: ‘Python’}]
フローコレクション
YAMLのストリームコレクションの構文は、以下に示すように、Pythonのリストおよび辞書構造の構文と非常によく似ています。
{ str: [15, 17], con: [16, 16], dex: [17, 18], wis: [16, 16], int: [10, 13], chr: [5, 8] }
上記のドキュメントは、次のPythonオブジェクトを表しています。
{ ‘dex’: [17, 18], ‘int’: [10, 13], ‘chr’: [5, 8], ‘wis’: [16, 16], ‘str’: [15, 17], ‘con’: [16, 16]}
スカラー
YAMLのスカラーには5つのスタイルがあり、そのうちブロックスカラーには2つのスタイルがあります。
文字通りのスタイル
折りたたんだスタイル
フロースカラーには3つのスタイルがあります:
プレーンスタイル
一重引用符のスタイル
二重引用符のスタイル
これらの5つのスタイルの例は次のとおりです。
plain: Hello World
一重引用符:「すべてのコンテンツはそのまま出力されます」
二重引用符:「特殊文字を転送するためにバックスラッシュを使用する必要がある」
literal: |
すべての行
大都市
ニューラインが含まれています
真ん中のすべての空白行
代わりにnewlineを使用します
folded:
最後の行を除いて
ニューライン
維持します
他の行の終わりにあるニューライン
代わりにスペースを使用します
真ん中の空白行
代わりに新しい行の文字を使用します
上記のドキュメントは、次のPythonオブジェクトを表しています。
{ ‘plain’: ‘Hello World’,
'一重引用符': 'すべてのコンテンツはそのまま出力されます'、
'二重引用符': '特殊文字はバックスラッシュで転送する必要があります'、
'literal': 'すべての行に\ n新しい行の文字が含まれます\ n中央のすべての空白行\ n \ nは新しい行の文字に置き換えられます\ n'、
'folded': '最後の行のnewline文字を除いて、他の行の終わりのnewline文字は保持されます。中央の空白行を置き換えるためにスペースが使用されます。\ n代わりにnewline文字が使用されます\ n'}
それぞれのスタイルには独自の特徴があります。通常のスカラーは、開始と終了を示すためにインジケーターを使用しないため、最も制限されたスタイルです。通常のスカラーは、パラメーターと属性の名前に当然適しています
一重引用符で囲まれたスカラーを使用すると、特殊文字を含まない任意の値を表すことができます。 「単一引用符で置き換えられた」隣接する引用符のペアでない限り、単一引用符で囲まれたスカラーのエスケープはありません。
二重引用符は最も強力なスタイルであり、任意のスカラー値を表すことができる唯一のスタイルです。二重引用符で囲まれたスカラー内の文字はエスケープできます。エスケープシーケンス\ x *および\ u ***を使用して、ASCIIまたはUnicode文字を表現します。
ブロックスカラースタイルには、テキストスタイルと折りたたみスタイルの2つがあります。テキストスタイルは、大きなテキストブロック(ソースコードなど)に最適なスタイルです。折りたたみスタイルはテキストスタイルに似ていますが、2つの隣接する空白以外の行の間の新しい行の文字は、行になるためにスペースに置き換えられます。
エイリアス
YAMLを使用して、クラス図構造の任意のオブジェクトを表します。ドキュメントの異なる部分から同じオブジェクトを参照する場合は、アンカーとエイリアスを使用する必要があります。
その中で、アンカーは&で表され、エイリアスは*で表されます。次の例は、アンカーとエイリアスの使用法を示しています。
emp1:&A
name: bob
age:28
gender: Male
emp2:*A
上記のドキュメントは、次のPythonオブジェクトを表しています。
{ ’emp1′: {‘name’: ‘bob’, ‘age’: 28, ‘gender’: ‘Male’},
’emp2′: {‘name’: ‘bob’, ‘age’: 28, ‘gender’: ‘Male’}}
PyYAMLは再帰オブジェクトをサポートするようになりました。次のドキュメントは、要素がリスト自体であるPythonリストを表しています。
&A [ *A ]
ラベル
ラベルは、ノードのデータタイプを識別するために使用されます。標準のYAMLタグの定義は、次のドキュメントを参照できます。
http://yaml.org/type/index.html
ラベルは暗黙的に次のようにすることができます。
boolen:true
integer:3
float:3.14
上記のドキュメントは、次のPythonオブジェクトを表しています。
{ ‘boolean’: True, ‘integer’: 3, ‘float’: 3.14}
以下に示すように、ラベルを明示的にすることもできます。
boolean:!!bool "true"
integer:!!int "3"
float:!!float "3.14"
上記のドキュメントは、次のPythonオブジェクトを表しています。
{ ‘boolean’: True, ‘integer’: 3, ‘float’: 3.14}
明示的に定義されたラベルのない通常のスカラーは、暗黙的なラベル解決の対象となります。暗黙的なラベル解決は、一連の正規式に基づいてスカラー値をチェックし、それらの1つが一致する場合、対応するタグをスカラーに割り当てます。 PyYAMLを使用すると、アプリケーションでカスタムの暗黙的なタグパーサーを追加できます。
YAMLタグとPython3オブジェクト
YAMLタグ | Pythonオブジェクト |
---|---|
標準のYAMLタグ | |
!! null | None |
!! bool | bool |
!! int | int |
!! float | float |
!! binary | bytes |
!! timestamp | datetime.datetime |
!! omap、!! pairs | 要素は2つのタプルのリストです |
!! set | set |
!! str | str |
!! seq | list |
!! map | dict |
Pythonの特別なタグ | |
!! python/none | None |
!! python/bool | bool |
!! python/bytes | bytes |
!! python/str | str |
!! python/unicode | str |
!! python/int | int |
!! python/long | int |
!! python/float | float |
!! python/complex | complex |
!! python/list | list |
!! python/tuple | tuple |
!! python/dict | dict |
複雑なPythonタグ | |
!! python/name:module.name | module.name |
!! python/module:package.module | package.module |
!! python / object:module.cls | module.clsのインスタンス |
!! python / object / new:module.cls | module.clsのインスタンス |
!! python / object / apply:module.func | メソッドfunc(...)の戻り値 |
文字列変換
Python3では、str型のオブジェクトはラベル!! strで識別されるスカラーに変換され、bytes型のオブジェクトはラベル!! binaryで識別されるスカラーに変換されます。互換性を考慮するために、タグ!! python / strおよび!! python / unicodeは引き続き使用でき、それらによって識別されるスカラーはタイプstrのオブジェクトに変換されます。
名前とモジュール
関数やクラスなどの静的Pythonオブジェクトを表すには、複雑なラベルPython !! python / nameを使用できます。次の例は、yamlモジュールでdumpメソッドを表す方法を示しています。
!! python/name:yaml.dump
同様に、モジュールはタグを使用できます!! python / module:
!! python/module.yaml
オブジェクト
タグを使用して、ピクルス可能なオブジェクトをシリアル化できます!! python / object:
!! python/object:module.Class { attribute: value, … }
ピクルスプロトコルをサポートするために、PyYAMLは2つの追加タグを提供します
!! python / object / new:module.Classおよび!! python / object / apply:module.function
これら2つのラベルの使用法は次のとおりです。
!! python/object/new:module.Class
args:[argument,...]
kwds:{key: value,...}
stat:...
listitems:[item,...]
dictitems:[key: value,...]!!python/object/apply:module.function
args:[argument,...]
kwds:{key: value,...}
state:...
listitems:[item,...]
dictitems:[key: value,...]
上記のpython操作yamlの説明は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。
Recommended Posts