pythonでyaml記法を学ぶ。

python

参考

Learn yaml in Y Minutes

テスト環境として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"