1. Mis on YAML?
YAML-i ülevaade
YAML (YAML Ain’t Markup Language) on üks andmete serialiseerimise vormingutest, mida kasutatakse laialdaselt struktureeritud andmete esitamiseks. See sarnaneb JSON-i ja XML-iga, kuid YAML-i peamiseks tugevuseks on selle lihtsus ja loetavus. Eriti kasulik on see, et ta kasutab taandeid hierarhia näitamiseks, mis muudab selle inimesele hõlpsasti loetavaks.
Erinevused JSON-i ja XML-iga
JSON ja XML on samuti andmete kirjeldamiseks kasutatavad vormingud, kuid YAML erineb neist oma vähese süntaktilise liigse märgistuse poolest, olles lihtsam ja arusaadavam. Näiteks JSON kasutab palju looksulge {}
ja koma ,
, mis võib suurte andmekogumite korral muuta lugemise raskeks. YAML-is näidatakse struktuuri taandega, mis muudab hierarhia visuaalselt paremini mõistetavaks.
Hea sobivus Pythoniga
Pythoni süntaks kasutab plokkide tähistamiseks taandeid, mis teeb selle YAML-iga hästi ühilduvaks. Lisaks saab Pythonis YAML-iga töötada “PyYAML” teegi abil, mis võimaldab YAML-faile lihtsalt lugeda ja kirjutada. Seetõttu kasutatakse YAML-i sageli seadistusfailidena.

2. Kuidas Pythonis YAML-faile lugeda ja kirjutada
YAML-faili lugemine
YAML-faili lugemiseks Pythonis tuleb esmalt paigaldada “PyYAML” teek ning kasutada yaml.safe_load()
funktsiooni. See funktsioon teisendab YAML-andmed turvaliselt Pythoni sõnastikuks või loendiks. Näide:
import yaml
# Ava YAML-fail ja loe sisu
with open('config.yaml', 'r') as file:
data = yaml.safe_load(file)
print(data)
See kood loeb YAML-faili ja käsitleb seda Pythoni sõnastikuna. Näiteks, kui YAML-fail sisaldab järgmist:
database:
host: localhost
port: 3306
Pythonis saadakse järgmine sõnastik:
{'database': {'host': 'localhost', 'port': 3306}}
YAML-faili kirjutamine
Andmete kirjutamiseks YAML-formaati kasutatakse funktsiooni yaml.dump()
. Näiteks:
import yaml
data = {
'name': 'John Doe',
'age': 30,
'city': 'New York'
}
with open('output.yaml', 'w') as file:
yaml.dump(data, file)
See kood salvestab sõnastiku data
faili output.yaml
. Tulemus:
age: 30
city: New York
name: John Doe
Jaapani keele käsitlemine
Kui YAML-failides kasutatakse Jaapani või muid mitte-ladina tähti, on oluline kasutada allow_unicode=True
parameetrit, et vältida märgistusvigu.
yaml.dump(data, file, allow_unicode=True)
3. Keerukamad YAML-i toimingud
Kohandatud siltide loomine
YAML võimaldab lisaks põhilistele andmetüüpidele (nimekirjad, sõnastikud) ka Pythoni objektide serialiseerimist ja deserialiseerimist. Selleks saab kasutada kohandatud silte. Näide Pythoni klassi salvestamisest YAML-formaadis:
import yaml
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def person_representer(dumper, data):
return dumper.represent_mapping('!Person', {'name': data.name, 'age': data.age})
def person_constructor(loader, node):
values = loader.construct_mapping(node)
return Person(values['name'], values['age'])
yaml.add_representer(Person, person_representer)
yaml.add_constructor('!Person', person_constructor)
# Objekti salvestamine YAML-i
person = Person('Alice', 25)
with open('person.yaml', 'w') as file:
yaml.dump(person, file)
# YAML-failist objekti taastamine
with open('person.yaml', 'r') as file:
loaded_person = yaml.load(file, Loader=yaml.FullLoader)
Sel moel saab Pythoni objekte salvestada kohandatud YAML-formaadis ja hiljem uuesti kasutada.
Järjekorra säilitamine
PyYAML ei säilita vaikimisi sõnastiku võtmete järjekorda. Kui järjekord on oluline, on soovitatav kasutada ruamel.yaml
teeki, mis võimaldab võtmete järjekorra säilitamist.

4. YAML-i kasutamine: seadistusfailide haldamine
YAML seadistusfailidena
YAML on laialdaselt kasutatav seadistusfailideks. Pythoni rakendustes on see ideaalne, kuna on inimloetav ja hierarhiat on lihtne mõista. Näiteks:
database:
host: localhost
port: 3306
username: user
password: pass
logging:
level: DEBUG
file: /var/log/app.log
Selliselt saab mitmeid seadeid lühidalt ja loetavalt kirjeldada.
Praktilised kasutusnäited
YAML-i kasutatakse laialdaselt projektides nagu Django, Flask, CircleCI ja Kubernetes. Enamasti konfiguratsiooni ja keskkonnamuutujate haldamiseks.
Django näide YAML-iga:
import yaml
with open('config.yaml', 'r') as file:
config = yaml.safe_load(file)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': config['database']['name'],
'USER': config['database']['username'],
'PASSWORD': config['database']['password'],
'HOST': config['database']['host'],
'PORT': config['database']['port'],
}
}
Võrdlus JSON-i ja XML-iga
JSON kasutab looksulge ja komasid, mis võivad muuta pikad failid raskesti loetavaks. XML muutub tihti liigselt mahukaks, kuna vajab algus- ja lõputägiseid. YAML aga kasutab taandeid, mis muudab konfiguratsioonid lihtsasti mõistetavaks.

5. Vigade käsitlemine ja tõrkeotsing
Levinud vead ja lahendused
Tüüpilised YAML-i töötlemise vead on failide puudumine või vigane formaat. Neid saab vältida korrektse veakäsitlusega.
import yaml
def load_yaml(file_path):
try:
with open(file_path, 'r') as file:
data = yaml.safe_load(file)
except FileNotFoundError:
print(f"Error: Faili {file_path} ei eksisteeri.")
return None
except yaml.YAMLError as e:
print(f"Error: YAML-parsimine ebaõnnestus. {e}")
return None
return data
config = load_yaml('config.yaml')
if config:
print(config)
Parimad praktikad
- Faili olemasolu kontroll: enne lugemist kontrollida, kas fail eksisteerib.
- Süntaksivigade käsitlemine: vigade püüdmine ja detailse teate andmine.
- Logimine: vigade logimine tõrkeotsingu hõlbustamiseks.
6. Kokkuvõte
YAML on lihtne ja inimloetav andmete serialiseerimise formaat. Pythonis on YAML-i lugemine ja kirjutamine väga lihtne, mis teeb sellest ideaalse vahendi konfiguratsioonide haldamiseks. Lisaks saab kasutada kohandatud silte, klasside serialiseerimist ja võtmete järjekorra säilitamist, mis muudavad YAML-i veelgi paindlikumaks.
YAML-i kasutamine ei piirdu ainult seadistusfailidega – see sobib ka üldiseks andmete salvestamiseks ning selle kasutus jätkub paljudes projektides.