Hoe kan ik een YAML-bestand in Python parseren

Hoe kan ik een YAML-bestand in Python parseren?


Antwoord 1, Autoriteit 100%

De eenvoudigste en puurste methode zonder te vertrouwen op C-headers is Pyyaml ​​(documentatie ), die kan worden geïnstalleerd Via pip install pyyaml:

#!/usr/bin/env python
import yaml
with open("example.yaml", 'r') as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

en dat is het. Een duidelijke yaml.load()-functie bestaat ook, maar yaml.safe_load()moet altijd de voorkeur hebben, tenzij u expliciet de arbitraire object serialisatie / deialization heeft verstrekt om te voorkomen Introductie van de mogelijkheid voor de uitvoering van willekeurige code.

Opmerking Het Pyyaml-project ondersteunt versies via de yaml 1.1 specificatie . Als yaml 1.2 specificatie ondersteuning is nodig, zie Ruamel.yaml Zoals opgemerkt in dit antwoord .


Antwoord 2, Autoriteit 15%

Read & amp; Schrijf YAML-bestanden met Python 2 + 3 (en Unicode)

# -*- coding: utf-8 -*-
import yaml
import io
# Define data
data = {
    'a list': [
        1, 
        42, 
        3.141, 
        1337, 
        'help', 
        u'€'
    ],
    'a string': 'bla',
    'another dict': {
        'foo': 'bar',
        'key': 'value',
        'the answer': 42
    }
}
# Write YAML file
with io.open('data.yaml', 'w', encoding='utf8') as outfile:
    yaml.dump(data, outfile, default_flow_style=False, allow_unicode=True)
# Read YAML file
with open("data.yaml", 'r') as stream:
    data_loaded = yaml.safe_load(stream)
print(data == data_loaded)

gemaakt YAML-bestand

a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
  foo: bar
  key: value
  the answer: 42

Common File Endings

.ymlen .yaml

Alternatieven

Voor uw aanvraag kan het volgende van belang zijn:

  • Ondersteuning door andere programmeertalen
  • Lees-/schrijfprestaties
  • Compactheid (bestandsgrootte)

Zie ook: Vergelijking van gegevensserialisatie-indelingen

Als je liever op zoek bent naar een manier om configuratiebestanden te maken, lees dan misschien mijn korte artikel Configuratiebestanden in Python


Antwoord 3, autoriteit 8%

Als u YAML heeft dat voldoet aan de YAML 1.2-specificatie(uitgebracht in 2009 ) gebruik dan ruamel.yaml(disclaimer: ik ben de auteur van dat pakket ).
Het is in wezen een superset van PyYAML, die het grootste deel van YAML 1.1 (vanaf 2005) ondersteunt.

Als je je opmerkingen wilt kunnen bewaren tijdens het rondreizen, moet je zeker ruamel.yaml gebruiken.

Het upgraden van het voorbeeld van @Jon is eenvoudig:

import ruamel.yaml as yaml
with open("example.yaml") as stream:
    try:
        print(yaml.safe_load(stream))
    except yaml.YAMLError as exc:
        print(exc)

Gebruik safe_load()tenzij je echt volledige controle hebt over de invoer, het nodig hebt (zelden het geval) en weet wat je doet.

Als u pathlib Pathgebruikt voor het manipuleren van bestanden, kunt u beter de nieuwe API gebruiken die ruamel.yaml biedt:

from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)

Antwoord 4, autoriteit 4%

Installeer eerst pyyaml met pip3.

Importeer vervolgens de yaml-module en laad het bestand in een woordenboek met de naam ‘my_dict’:

import yaml
with open('filename.yaml') as f:
    my_dict = yaml.safe_load(f)

Dat is alles wat je nodig hebt. Nu staat het hele yaml-bestand in het woordenboek ‘my_dict’.


Antwoord 5

Voorbeeld:


defaults.yaml

url: https://www.google.com

omgeving.py

from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']

Antwoord 6

Om als volgt toegang te krijgen tot een element van een lijst in een YAML-bestand:

global:
  registry:
    url: dtr-:5000/
    repoPath:
  dbConnectionString: jdbc:oracle:thin:@x.x.x.x:1521:abcd

U kunt het volgende python-script gebruiken:

import yaml
with open("/some/path/to/yaml.file", 'r') as f:
    valuesYaml = yaml.load(f, Loader=yaml.FullLoader)
print(valuesYaml['global']['dbConnectionString'])

Antwoord 7

Ik gebruik ruamel.yaml. Details & debatteer hier.

from ruamel import yaml
with open(filename, 'r') as fp:
    read_data = yaml.load(fp)

Het gebruik van ruamel.yamlis compatibel (met enkele eenvoudig oplosbare problemen) met oud gebruik van PyYAML en zoals vermeld in de link die ik heb verstrekt, gebruik

from ruamel import yaml

in plaats van

import yaml

en het zal de meeste van je problemen oplossen.

EDIT: PyYAML is niet dood, zo blijkt, het wordt alleen op een andere plaats onderhouden.


Antwoord 8

#!/usr/bin/env python
import sys
import yaml
def main(argv):
    with open(argv[0]) as stream:
        try:
            #print(yaml.load(stream))
            return 0
        except yaml.YAMLError as exc:
            print(exc)
            return 1
if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))

Other episodes