Un ghid cuprinzător pentru YAML folosind Python

By Alexandru Corbaru

yaml tutorial comprehensive guide yaml using python

Acest tutorial YAML explică ce este YAML, conceptele de bază ale YAML, cum ar fi tipurile de date, validatorul YAML, analizorul, editorul, fișierele etc., cu ajutorul exemplelor de cod folosind Python:

Prelucrarea textului în informatică îi ajută pe programatori să creeze programe și aplicații configurabile. Limbajele de markup joacă un rol vital în stocarea și schimbul de date într-un format lizibil de către om.

Mai mult, programatorii folosesc limbaje de marcare ca obișnuite și formate standard de schimb de date între diferite sisteme. niste exemple dintre limbajele de markup includ HTML, XML, XHTML și JSON.

Am împărtășit informații despre încă un limbaj de markup în acest tutorial YAML ușor de urmat.

Acest tutorial îi ajută pe cititori să găsească răspunsuri la întrebările de mai jos. Cursanții pot face primii pași și pot înțelege misterul limbajelor de markup în general și YAML în special.

Întrebările includ:

De ce avem nevoie de limbaje de markup?

Ce înseamnă YAML?

De ce a fost creat YAML?

De ce trebuie să învățăm YAML?

De ce este important astăzi să învățăm YAML?

Ce tip de date pot stoca într-un YAML?

Acest ghid este util și pentru cititorii cu experiență, deoarece discutăm concepte în contextul programării în general și, de asemenea, în contextul testării software-ului. De asemenea, vom aborda subiecte precum Serializarea și Deserializarea aici.

Ce veți învăța:

Ce este YAML

Creatorii YAML l-au numit inițial drept „încă un limbaj de marcare”. Cu toate acestea, cu timpul, acronimul s-a schimbat în „YAML Ain’t a MarkUp language”. YAML este un acronim care se referă la el însuși și se numește acronim recursiv.

Putem folosi acest limbaj pentru a stoca date și configurații într-un format lizibil de către om. YAML este un limbaj elementar de învățat. Construcțiile sale sunt ușor de înțeles.

Clark, Ingy și Oren au creat YAML pentru a aborda complexitatea înțelegerii altor limbaje de marcare, care sunt greu de înțeles, iar curba de învățare este, de asemenea, mai abruptă decât învățarea YAML.

Pentru ca învățarea să fie mai confortabilă, ca întotdeauna, folosim un eșantion de proiect. Găzduim acest proiect pe Github cu licență MIT pentru ca oricine să facă modificări și să trimită o cerere de extragere, dacă este necesar.

Puteți clona proiectul utilizând comanda de mai jos.

git clone

Cu toate acestea, dacă este necesar, puteți descărcați fișierul zip fișier pentru cod și exemple.

Alternativ, cititorii pot clona acest proiect cu ajutorul IntelliJ IDEA. Vă rugăm să completați secțiunea privind cerințele preliminare pentru a instala Python și configurați-l cu IntelliJ IDEA înainte de clonarea proiectului.

De ce avem nevoie de limbaje de markup

Este imposibil să scrieți totul în codul software. Acest lucru se datorează faptului că trebuie să menținem codul din când în când și trebuie să abstractizăm specificul fișierelor sau bazelor de date externe.

Este o bună practică să reduceți codul la minimum posibil și să-l creați într-un mod care să nu necesite modificări pentru diversele date de intrare pe care le necesită.

De exemplu, putem scrie o funcție pentru a prelua datele de intrare dintr-un fișier extern și pentru a imprima conținutul său rând cu rând, mai degrabă decât să scriem codul și datele împreună într-un singur fișier.

Este considerată o bună practică, deoarece separă preocupările legate de crearea datelor și crearea codului. Abordarea de programare a abstractizării datelor din cod asigură o întreținere ușoară.

Limbajele de marcare ne facilitează stocarea informațiilor ierarhice într-un format mai accesibil și mai ușor. Aceste fișiere pot fi schimbate între programe prin internet fără a consuma o lățime de bandă mare și acceptă cele mai comune protocoale.

Aceste limbi respectă un standard universal și acceptă diverse codificări pentru a susține caractere aproape din toate limbile vorbite din lume.

Cel mai bun lucru despre limbajele de markup este că utilizarea lor generală nu este asociată cu nicio comandă de sistem, iar această caracteristică le face mai sigure și este motivul adoptării lor pe scară largă și la nivel mondial. Prin urmare, este posibil să nu găsiți comenzi YAML pe care să le putem executa direct pentru a crea orice ieșire.

Avantajele utilizării unui fișier YAML

YAML are multe beneficii. Tabelul de mai jos arată o comparație între YAML și JSON. JSON înseamnă JavaScript Object Notation și îl folosim ca format de schimb de date.

Atribut YAML JSON Verbozitate Mai puțin verbos Mai detaliat Tipuri de date Suportă tipuri de date complexe. Nu acceptă tipuri de date complexe. Comentarii Suportă scrierea de comentarii folosind „#”. Nu acceptă scrierea de comentarii. Citibilitate Mai lizibil de oameni. Mai puțin lizibil de om. Auto-referințe Suportă elemente de referință din aceleași documente folosind „&,” și *. Nu acceptă autorreferențierea. Documente multiple Suportă mai multe documente într-un singur fișier. Suportă un singur document într-un singur fișier.

Datorită beneficiilor YAML față de celelalte formate de fișiere, cum ar fi JSON, YAML este mai răspândită printre dezvoltatori pentru versatilitatea și flexibilitatea sa.

Precondiții

Mai întâi instalăm Python și apoi configurăm Python și pachetele sale cu IntelliJ IDEA. Prin urmare, vă rugăm să instalați IntelliJ IDEA dacă nu este deja instalat înainte de a continua.

Instalați Python

Urmați acești pași pentru a instala și configura Python pe Windows 10.

Pasul 1

Descărcați Python și instalați-l selectând setarea așa cum se arată în imaginea de mai jos.

Pasul 2

Porniți configurarea și selectați personalizați instalarea. Bifați caseta de selectare a Adăugarea Python la PATH .

Pasul 3

Personalizați locația Python așa cum este afișată în imagine.

Pasul 4

Mergeți mai departe cu instalarea. La sfârșitul expertului de instalare Dezactivați limita de cale pe Windows făcând clic pe opțiunea de pe Expert.

Acum, configurarea Python este completă.

Configurați Python cu IntelliJ IDEA

Să configurăm acum IntelliJ IDEA cu Python. Primul pas este instalarea pluginurilor pentru a putea lucra la proiecte Python.

Instalați pluginuri Python

Instalați Python Community Edition

Instalați Python Security

Urmați pașii de mai jos pentru a finaliza configurarea.

Pasul 1

Utilizați meniul Fișier și accesați setările Platformă. Faceți clic pe Adăugați butonul SDK .

Pasul 2

Selectează Opțiunea de mediu virtual și selectați interpretul de bază al Python ca cel care a fost instalat în pasul anterior.

Pasul 3

Acum selectați mediul virtual creat în pasul anterior sub Setări SDK de proiect .

Vă recomandăm un mediu virtual pentru un proiect.

Pasul 4 [Opțional]

Deschideți fișierul config.py din exploratorul de proiecte și faceți clic pe cerințele de instalare , așa cum se arată în imaginea de mai jos.

Ignorați cerința ipython, dacă este necesar, debifând o opțiune din dialogul Alegeți pachetul.

Acum, puteți accesa secțiunea următoare pentru a afla elementele de bază ale YAML.

Bazele YAML

În această secțiune, menționăm elementele de bază ale YAML cu ajutorul unui exemplu de fișier numit config.yml și config.py. Credem cu tărie că explicarea conceptelor de YAML în paralel cu utilizarea acestuia într-un limbaj de programare face învățarea mai bună.

Prin urmare, în timp ce explicăm elementele de bază în YAML, implicăm și utilizarea Python pentru a citi și scrie datele stocate în YAML.

Acum să creăm sau să deschidem config.yml în editorii noștri respectivi și să înțelegem YAML.

--- quiz: description: > 'This Quiz is to learn YAML.' questions: - ['How many planets are there in the solar system?', 'Name the non-planet'] - 'Who is found more on the web?' - 'What is the value of pi?' - 'Is pluto related to platonic relationships?' - 'How many maximum members can play TT?' - 'Which value is no value?' - 'Don't you know that the Universe is ever-expanding?' answers: - [8, 'pluto'] - cats - 3.141592653589793 - true - 4 - null - no # explicit data conversion and reusing data blocks extra: refer: &id011 # give a reference to data x: !!float 5 # explicit conversion to data type float y: 8 num1: !!int '123' # conversion to integer str1: !!str 120 # conversion to string again: *id011 # call data by giving the reference

Observați că fișierele YAML iubescextensie. Limbajul este sensibil la majuscule și minuscule. Folosim spații și nu file pentru indentare.

Împreună cu aceste elemente de bază, să înțelegem tipurile de date. În YAML menționat, am reprezentat informațiile într-un test. Un test este descris ca un nod de nivel rădăcină, având atribute precum o descriere, întrebări și răspunsuri.

Tipuri de date YAML

YAML poate stoca scalare, secvențe și mapări. Am afișat cum să scriem toate tipurile de date necesare în fișierul config.yml.

Scalarele sunt șiruri, numere întregi, flotante și booleeni. Datele de tip Șiruri sunt cuprinse între ghilimele duble “. Cu toate acestea, YAML nu impune șiruri de scriere între ghilimele duble și putem folosi> sau | pentru a scrie șiruri lungi în mai multe rânduri.

Uitați-vă la diferitele tipuri de date și valori mapate în tabelul de mai jos.

Tipul de date Exemple de tipuri de date în Config.yml Şir

Șirurile pot fi stocate cu sau fără ghilimele. test:

descriere:>

Acest test este de a învăța YAML

întrebări:

- „Cine se găsește mai mult pe web?”

răspunsuri:

- pisici

Întreg și plutitor

Numerele întregi și plutitorul sunt menționate în forma lor originală

test:

întrebări:

- „Care este valoarea lui pi?”

- „Câți membri maximum pot juca TT?”

răspunsuri:

- 3.141592653589793

- 4

Boolean

Booleanele sunt stocate folosind șirul adevărat / fals sau da / nu

test:

întrebări:

- „Plutonul este legat de relațiile platonice?”

- „Nu știi că Universul se extinde mereu?”

răspunsuri:

- Adevărat

- nu face

Secvențe

Secvențele sunt create cu ajutorul parantezelor pătrate [.

test:

răspunsuri:

- [8, „pluto”]

Referințe

Autoreferențierea este utilizată cu ajutorul lui și și *

# conversie explicită a datelor și reutilizarea blocurilor de date

suplimentar:

refer: & id011 # da o referință la date

# Alte valori

din nou: * id011 # date de apel oferind referința

Mai jos sunt enumerate câteva dintre elementele demne de remarcat ale unui fișier YAML.

Document

Acum observă cele trei liniuțe -. Semnifică începutul unui document. Stocăm primul document cu un test ca element rădăcină, iar descrierea, întrebările și răspunsurile ca elemente copil cu valorile lor asociate.

Tipuri de date explicite

Observați cheia de secțiune numită extra din config.yml. Vedem că, cu ajutorul exclamațiilor duble, putem menționa în mod explicit tipurile de date ale valorilor stocate în fișier. Convertim un număr întreg într-un float folosind !! float. Folosim !! str pentru a converti un întreg în șir și folosim !! int pentru a converti șirul într-un întreg.

Pachetul YAML al Python ne ajută să citim fișierul YAML și să-l stocăm intern ca dicționar. Python stochează cheile de dicționar ca șiruri și convertește automat valorile în tipuri de date Python, cu excepția cazului în care este specificat explicit folosind „!!”

Citiți fișierul YAML în Python

În general, folosim Editorul YAML și un validator YAML în momentul scrierii YAML. Validatorul YAML verifică fișierul în momentul scrierii.

Pachetul Python YAML are un analizor YAML încorporat, care analizează fișierul înainte de a-l stoca în memorie.

Acum să creăm și să deschidem config.py în editorii respectivi cu conținutul de mai jos.

import yaml import pprint def read_yaml(): ''' A function to read YAML file''' with open('config.yml') as f: config = yaml.safe_load(f) return config if __name__ == '__main__': # read the config yaml my_config = read_yaml() # pretty print my_config pprint.pprint(my_config)

Pentru a testa dacă ați parcurs pașii descriși mai sus, rulați config.py.

Deschideți fișierul config.py în IntelliJ IDEA, localizați blocul principal și rulați fișierul utilizând pictograma redare.

Odată ce rulăm fișierul, vedem consola cu ieșirea.

În funcția read_yaml, deschidem fișierul config.yml și folosim metoda safe_load a pachetului YAML pentru a citi fluxul ca un dicționar Python și apoi returnăm acest dicționar folosind cuvântul cheie return.

variabila my_config stochează conținutul fișierului config.yml ca dicționar. Folosind frumosul pachet de imprimare Python numit pprint, imprimăm dicționarul pe consolă.

Observați rezultatul de mai sus. Toate etichetele YAML corespund tipurilor de date Python, astfel încât programul să poată utiliza în continuare valorile respective. Acest proces de construire a obiectelor Python din introducerea textului se numește Deserializare.

Scrieți fișierul YAML în Python

Deschideți config.py și adăugați următoarele linii de cod chiar sub metoda read_yaml și deasupra blocului principal al fișierului.

def write_yaml(data): ''' A function to write YAML file''' with open('toyaml.yml', 'w') as f: yaml.dump(data, f)

În metoda write_yaml, deschidem un fișier numit toyaml.yml în modul write și folosim metoda de dump a pachetelor YAML pentru a scrie documentul YAML în fișier.

Acum adăugați liniile de cod de mai jos la sfârșitul fișierului config.py

# write A python object to a file write_yaml(my_config)

Salvați config.py și rulați fișierul folosind comanda de mai jos sau folosind pictograma de redare din IDE.

python config.py

Vedem că comanda de mai sus imprimă conținutul config.yml pe consola sau pe ieșirea sistemului. Programul Python scrie același conținut într-un alt fișier numit toyaml.yml. Procesul de scriere a obiectului Python într-un fișier extern se numește Serializare.

Documente multiple în YAML

YAML este destul de versatil și putem stoca mai multe documente într-un singur fișier YAML.

Creați o copie a fișierului config.yml ca configs.yml și lipiți liniile de mai jos la sfârșitul fișierului.

--- quiz: description: | This is another quiz, which is the advanced version of the previous one questions: q1: desc: 'Which value is no value?' ans: Null q2: desc: 'What is the value of Pi?' ans: 3.1415

Trei liniuțe - în fragmentul de mai sus marchează începutul unui nou document în același fișier. Utilizarea | după eticheta de descriere ne permite să scriem un text cu mai multe linii de tip șir. Aici, în noul document, am stocat întrebări și răspunsuri ca mapări separate imbricate sub întrebări.

Acum creați un fișier nou numit configs.py și lipiți codul menționat mai jos în fișier.

import yaml import pprint def read_yaml(): ''' A function to read YAML file''' with open('configs.yml') as f: config = list(yaml.safe_load_all(f)) return config def write_yaml(data): ''' A function to write YAML file''' with open('toyaml.yml', 'a') as f: yaml.dump_all(data, f, default_flow_style=False) if __name__ == '__main__': # read the config yaml my_config = read_yaml() # pretty print my_config pprint.pprint(my_config) # write A python object to a file write_yaml(my_config)

Observați modificările funcțiilor read_yaml și write_yaml. În read_yaml, folosim metoda safe_load_all a pachetului YAML pentru a citi toate documentele prezente în configs.yml ca listă. În mod similar, în write_yaml, folosim metoda dump_all pentru a scrie lista tuturor documentelor citite anterior într-un fișier nou numit toyaml.yml.

Acum rulați configs.py.

python configs.py

Ieșirea comenzii de mai sus este afișată mai jos.

[{'quiz': {'answers': [[8, 'pluto'], 'cats', 3.141592653589793, True, 4, None, False], 'description': 'This Quiz is to learn YAML', 'questions': [['How many planets are there in the solar system?', 'Name the non planet'], 'Who is found more on the web?', 'What is the value of pi?', 'Is pluto related to platonic relationships?', 'How many maximum members can play TT?', 'Which value is no value?', 'Don't you know that Universe is ever-expanding?']}}, {'quiz': {'description': 'This is another quiz, which ' 'is the advanced version of the previous one ', 'questions': {'q1': {'ans': None, 'desc': 'Which value is no value?'}, 'q2': {'ans': 3.1415, 'desc': 'What is the value of Pi?'}}}}]

Ieșirea este similară cu ieșirea unică a documentului menționată anterior. Python convertește fiecare document din configs.yml într-un dicționar Python. Este mai ușor pentru prelucrarea și utilizarea ulterioară a valorilor.

întrebări frecvente

Puteți întâlni întrebările de mai jos în timp ce lucrați cu YAML.

Q # 1) Este posibil să se păstreze Ordinea de mapări YAML?

Răspuns: Da, este posibil să personalizați comportamentul implicit al încărcătoarelor din pachetul pyYAML al Python. Aceasta implică utilizarea OrderedDicts și suprascrierea rezolvării de bază cu metode personalizate, așa cum se arată Aici .

Q # 2) Cum se stochează o imagine în YAML?

Răspuns: Puteți codifica o imagine baz64 și să o păstrați în YAML, așa cum se arată mai jos.

image: !!binary | iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==

Q # 3) Care este diferența dintre> și | etichete în YAML?

Răspuns: Ambele> și | permite scrierea valorilor în mai multe linii în YAML. Folosim mai mare decât simbolul> pentru a scrie șiruri cu mai multe linii și | pentru a reprezenta valori literale. Valori scrise folosind | nu trebuie scăpat. De exemplu, putem stoca Html folosind |.

template: | This is a test paragraph This is another paragraph

Q # 4) Care este semnificația ... la sfârșitul fișierului YAML.

Răspuns: Trei perioade ... sunt identificatori opționali. Acestea pot fi folosite pentru a marca sfârșitul documentului într-un flux.

Q # 5) Cum se scrie comentarii în fișierul YAML?

Răspuns: Folosim # pentru a scrie un singur comentariu pe linie. YAML nu acceptă comentarii pe mai multe linii. Astfel, trebuie să folosim # în mai multe linii, așa cum se arată mai jos.

# this is # a single line as well as multi-line # comment

Concluzie

În acest ghid, am acoperit pașii de pregătire a mediului de dezvoltare atât în ​​Windows, cât și în Linux, pentru a începe cu YAML. Aproape am discutat toate conceptele tipurilor de date de bază YAML, editorul YAML și analizorul YAML.

De asemenea, am evidențiat avantajele utilizării YAML față de alte limbaje de marcare și am furnizat exemple de coduri cu ajutorul unui proiect de probă de sprijin. Sperăm că acum cursanții pot folosi YAML pentru a extrage date din logica aplicației pentru a scrie cod eficient și care poate fi întreținut.

Învățare fericită !!