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
.yml
en .yaml
Alternatieven
- CSV: Super Simple-formaat (lees & amp; schrijf )
- JSON: Nice voor het schrijven van menselijke leesbare gegevens; Zeer vaak gebruikt (lees & amp; schrijf )
- YAML: YAML is een superset van JSON, maar gemakkelijk te lezen (lees & amp; schrijf , Comparisison van JSON en YAML )
- Pickle: een Python Serialisation Format (lees & amp; schrijf )
- MessionPack (Python-pakket ): meer compacte weergave (lees & amp; schrijf )
- HDF5 (Python-pakket ): Leuk voor matrices (lees & amp; schrijf )
- XML: bestaat ook *zucht* (lees& schrijf)
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 Path
gebruikt 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:]))