pythonでyaml記法を学ぶ。
python参考
テスト環境としてpythonを利用した。
Python で YAML ファイルを扱う – まくまくPythonノート
pyyamlをinstall
pip install pyyaml
yaml
基本のコード
読み込み。
import yaml
import sys
try:
with open('read.yaml') as file:
obj = yaml.safe_load(file)
print(obj['x'])
#ファイルの中身を全部出力してみる。
print(yaml.dump(obj))
#ファイルが開けなかったとき
except FileNotFoundError as e:
print( "FileNotFoundError" )
#keyがない。
except KeyError as e:
print( "KeyError" )
#except Exception as e:
# sys.exit(1)
ファイルに書き込む
,..dumpを使うと、アルファベット順で出力される。
#ファイルに出力する。
path = 'anko.txt'
f = open(path , "w" )
yaml.dump( obj , f )
f.close()
yaml記法
mapや辞書形式で書くことができる。
key: value
クォート
ダブルクォーテーションはあってもなくても変わらなかった。
key: "value" -> value
keyもクォーテーションで囲える。
# anko: usako
'anko': "usako"
シングルクォーテーションではなじみのない処理になる。
# quotes: anko'inko'test
quotes: 'anko''inko''test'
quotes: 'anko\'anko' -> エラー
quotes: 'anko'anko' -> エラー
ダブルクォーテーションでは親しみ深い
# quotes: anko"anko
quotes: "anko\"anko"
ダブルクォーテーションで展開するものされないもの
改行周りぐらいか
# quotes: "have many: \", \0, \t, \u263A, \r\n == \r\n, and more."
quotes: "have many: \", \0, \t, \u263A, \x0d\x0a == \r\n, and more."
python側の問題かもしれないが。
key: "valu'e" -> valu'e
key: "valu'e -> エラー
key: valu'e" -> key: valu'e"
文字コード
UTF-8/16/32 characters need to be encoded
辞書側にUnicodeエスケープした文字列を記載しても
これらは自動でエンコードされない。
Superscript two: \u00B2
配列の扱い
z: [200, 300, 400]
#python側で変数を指定して出力した。
[200, 300, 400]
#dumpで出力した。
z:
- 200
- 300
- 400
型相当
# 4
byte: 0b100
# 291
hex : 0x123
key/valueに空白を使える。
key with spaces: value
null
未記入やチルダはnullになる。
test :
another_null : ~
null_value: null
一部の名前は変換される。
こういうのも予約語というのだろうか?
# false: false
no: no
# true: false
yes: No
# boolean: true
boolean: true
# enclosed: 'yes'
enclosed: "yes"
複数行入力
下記の記号を使用して入力する。
入力する内容はインデントを使わないとエラーになる。
記号の前にスペースが必要である。
また、複数入力はインデントに対応しているが、space2個になっている。
|
空欄を詰めて表示する。>
空欄を空欄として表示する。|-
テキスト末尾の改行が削除される。>-
テキスト末尾の改行が削除される。
行ごとの改行が取り除かれスペースに変換される。|+
末尾の改行が保持される。>+
末尾の改行が保持される。
行ごとの改行が取り除かれスペースに変換される。
test: >
テスト
テスト
anko : |
テスト
テスト
test: >-
テスト
テスト
# ↑末尾
anko : |-
テスト
テスト
# ↑末尾
要素の入れ子
インデント(スペースx2)を使うことによって入れ子にすることができる。
要素は配列として得ることができる。
test:
aaa : ccc
bbb : ddd
{'aaa': 'ccc', 'bbb': 'ddd'}
キーに改行が使えてしまう。
? |
aaa bbb
: and this is its value
print(obj['aaa bbb\n'])
複雑なキーについて。
これはpythonでは使えなかった。
? - Manchester United
- Real Madrid
: [ 2001-01-01, 2002-02-02 ]
markdownチックな書き方で、配列を記入できる。
markdown_like:
- Item 1
- Item 2
- 0.5 # sequences can contain disparate types.
- Item 4
- key: value
another_key: another_value
- - This is a sequence
- inside another sequence
- - - Nested sequence indicators
- can be collapsed
['Item 1', 'Item 2', 0.5, 'Item 4', {'key': 'value', 'another_key': 'another_value'}, ['This is a sequence', 'inside another sequence'], [['Nested sequence indicators', 'can be collapsed']]]
jsonライクな記法ができるらしい。
json_map: { "key": "value" }
json_seq: [ 3, 2, 1, "takeoff" ]
and quotes are optional: { key: [ 3, 2, 1, takeoff ] }
value
and quotes are optional:
key:
- 3
- 2
- 1
- takeoff
json_map:
key: value
json_seq:
- 3
- 2
- 1
- takeoff
入れ子に対してpythonからアクセスする。
json_map: { "key": "value" }
aa = obj["json_map"]
print( aa["key"] )
変数の複製ができる。
anchored: &anchor This string will appear as the value of two keys.
call : *anchor
anchored: This string will appear as the value of two keys.
call: This string will appear as the value of two keys.
下記はエラーになる。
call : aaa *anchor bbb
初期値として扱えるようだ。
base: &base
name: Everyone has same name
bar:
<<: *base
age: 20
foo:
<<: *base
age: 10
name: John
base:
name: Everyone has same name
bar:
age: 20
name: Everyone has same name
foo:
age: 10
name: John
一応ながら型の概念がある。
!!srtがわかりやすい。
# Syntax: !![typeName] [value]
explicit_boolean: !!bool true
explicit_datetime: !!timestamp 2022-11-17 12:34:56.78 +9
explicit_float: !!float -42.24
explicit_integer: !!int 42
explicit_null: !!null null
explicit_string: !!str 0.5
explicit_boolean: true
explicit_datetime: 2022-11-17 12:34:56.780000+09:00
explicit_float: -42.24
explicit_integer: 42
explicit_null: null
explicit_string: '0.5'
以下のようにするとkey:nullになる。
set:
? item1
? item2
? item3
or: { item1, item2, item3 }
# Sets are just maps with null values; the above is equivalent to:
set2:
item1: null
item2: null
item3: null
or:
item1: null
item2: null
item3: null
set:
item1: null
item2: null
item3: null
set2:
item1: null
item2: null
item3: null
dumpに置ける仕様。
アルファベット上に並べられた。
Unicodeエスケープされる。
# test: テスト
test: "\u30C6\u30B9\u30C8"