Ugrás a fő tartalomra

Yaml használat pythonban



A YAML egy adat beolvasást támogató nyelv, amit úgy terveztek, hogy közvetlenül (ember által) is olvasható és írható, könnyen értelmezhető legyen.

Hagyományosan properties, xml és json filekból olvassa el a program indításhoz szükséges paramétereket egy program (pláne ha sok konfigurációs paraméterre, finom beállításokra van szükség).
Ezen az úton egy új megoldás a yaml.


A JSON formátumnak egy szigorú befoglaló halmazát alkotja, kiegészítve azt szintaktikai jelentéssel bíró sortörésekkel és indentációval (behúzásokkal), a Pythonhoz hasonlóan. 


Figyelem : 
  -  a Pythonnal ellentétben azonban a YAML nem engedélyezi a közvetlen tabulátor karakterek jelenlétét.
  -  UTF-8 ékezetes betűk használhatóak, ha a fájl kódlása megfelelő, a kódolást a tartalomban explicit nem kell (és nem is lehet) feltüntetni.
   - az ismétlődő kulcsok, amelyek érvényes JSON-ban,  érvénytelenek YAML-ban.



Használat


Napjainkban előszeretettel használják a felsző szolgáltatások (Cloud Computering) és konténerek (Docker, kubernetes, ..) világában konfigurálásra, valamit a GIT is alkalmazza.  (pl.: .workflow.yml)
A yaml filek kiterjesztése : yaml vagy yml




Fogalmak

YAML (a rekurzív betűszó for "YAML Ain't Markup Language") egy ember által olvasható adat-sorosítási nyelv. 

Általában tehát használják konfigurációs fájloknál és olyan alkalmazásokban, ahol adatokat tárolnak vagy továbbítanak,  hasonlóan minta XML, JSON, properties filek esetén.

A YAML ugyanazokat a kommunikációs alkalmazásokat célozza meg, mint a Bővíthető jelölőnyelv (XML), de minimális szintaxisa van, amely szándékosan különbözik ettől SGML.

A YAML tehát elfogadja a teljes Unicode karakterkészletet, néhány kivételével vezérlő karakterek, és kódolható UTF-8, UTF-16 és UTF-32. 


Linkek  
Yaml honlap : https://yaml.org/
Yaml online validáció : http://www.yamllint.com/

Szintaktikai értelmezés:


Alapvetően kulcs érték párokkal dolgozik.



Például


kulcs: érték

masik_kulcs: Másik érték jön ide.

egy_szam: 100

tudomanyos_jelolessel: 1e+12

boolean: true

null_value: null

kulcs benne szóközökkel: érték

# Látható, hogy a sztringeket nem szükséges idézőjelek közé zárni, bár szabad.

Továbbá: "Idézőjelekkel megadott sztring."

"A kulcs is lehet idézőjeles.": "Hasznos lehet, ha ':'-ot akarsz a kulcsban."


# A kommentek YAML-ban is így néznek ki.

 

# A gyökér objektumunk egy map (hasonlóan a dictionary, hash vagy object)

 

Egyszerű típusok megadási szerkezete kulcs értékpárokkal történik

 

kulcs: érték

masik_kulcs: Másik érték jön ide.

egy_szam: 100

tudomanyos_jelolessel: 1e+12

boolean: true

null_value: null

kulcs benne szóközökkel: érték

 

A sztringeket nem szükséges idézőjelek közé zárni, bár szabad.

Továbbá: "Idézőjelekkel megadott sztring."

"A kulcs is lehet idézőjeles.": "Hasznos lehet, ha ':'-ot akarsz a kulcsban."

 

# Többsoros sztringek írhatóak 'literal block'-ként ('|' jelet használva)  vagy 'folded block'-ként is ('>' jelet használva).

 

 

literal_block: |

    Ez az egész szöveg-blokk lesz az értéke a literal_block kulcsnak, a sortöréseket megtartva.

     Az ilyen sztringet az indentáció visszahúzása zárja le, a behúzás pedig  eltávolításra kerül.

    A 'még jobban' behúzott részek megtartják a behúzásukat  ezeknek a soroknak 4 szóköz behúzása lesz.

 

 

folded_style: >

    Az az egész szöveg-blokk lesz az értéke a 'folded_style' kulcsnak, de  ezúttal minden sortörés egy szóközre lesz cserélve.

  Az üres sorok, mint a fenti, új sor karakterre cserélődnek.

  A 'még jobban' behúzott sorok megtartják a sortöréseiket,  ez a szöveg két sorban jelenik meg.

 

 

Különleges kulcs használatok

# A mapeknek nem csak sztring kulcsaik lehetnek.

0.25: lebegőpontos kulcs 

 

# A kulcsok lehetnek többsoros objektumok is, ? jellel jelezve a kulcs kezdetét

? |

    Ez itt egy

    többsoros kulcs

: és ez az értéke

 

# Szintén engedélyezett a kollekció típusok használata kulcsként, de egyéb  nyelvekben ez gyakran problémákat fog okozni.

 

 

 

A Gyűjtemény típusok megadásánál a struktúra is fontos

 

# Itt az egymásba ágyazás a behúzás változtatásával érhető el.

beagyazott_map:                            ## kezdő szint (megjegyzés)

    key: value

    another_key: Another Value

    masik_beagyazott_map:          ## másik szint (megjegyzés)

          hello: hello

 

 

 

Listák megadása (szekvenciák, listákkal vagy tömbökkel egyenértékűek)

egy_szekvencia:

    - Item 1

    - Item 2

    - 0.5                      ## Többféle típust is tartalmazhat (megjegyzés)

    - Item 4

    - key: value

      another_key: another_value

    -

        - Ez egy szekvencia

        - egy másik szekvenciába ágyazva

 

# A YAML a JSON befoglaló halmazát alkotja, ezért elfogadja a JSON szintaxisú mapek és szekvenciák is használatát:

json_map: {"key": "value"}

json_seq: [3, 2, 1, "takeoff"]

 

 

 

Különleges YAML képességek

 

# A YAML-ben ún. 'anchor'-ök segítségével könnyen lehet duplikálni a  tartalmakat a dokumentumon belül. A következő kulcsok azonos értékkel bírnak:

anchored_tartalom: &anchor_neve Ez a sztring két kulcs értéke is lesz.

másik_anchor: *anchor_neve

 

# Vannak a YAML-ben tagek is, amivel explicit lehet típusokat jelölni.

explicit_string: !!str 0.5

# Bizonyos implementációk nyelv-specifikus tageket tartalmaznak, mint

# például ez a Python komplex szám típusának jelölésére:

python_complex_number: !!python/complex 1+2j



Összevetés (json, yaml, hjson)

JSON

{ 'first_name': 'John', 'last_name': 'Smith', 'age': 25, 'address': { 'street_address': '21 2nd Street', 'city': 'New York', 'state': 'NY', 'postal_code': '10021' }, 'phone_numbers': [ { 'type': 'home', 'number': '212 555-1234' }, { 'type': 'fax', 'number': '646 555-4567' } ], 'sex': { 'type': 'male' } } 


YAML

first_name: John last_name: Smith age: 25 address: street_address: 21 2nd Street city: New York state: NY postal code: '10021' phone_numbers: - type: home number: 212 555-1234 - type: fax number: 646 555-4567 sex: type: male 


hjson

{ first_name: John last_name: Smith age: 25 address: { street_address: 21 2nd Street city: New York state: NY postal_code: 10021 } phone_numbers: [ { type: home number: 212 555-1234 } { type: fax number: 646 555-4567 } ] sex: { type: male } } 

Adatpéldák a Wikipédiából


Minta:

https://github.com/klajosw/python/blob/master/kl_py_yaml_01.ipynb

Megjegyzések