Wie kann ich eine YAML-Datei in Python analysieren?
Wie kann ich eine YAML-Datei in Python analysieren?
Antworten:
Die einfachste und reinste Methode ohne C-Header ist PyYaml ( Dokumentation ), die installiert werden kann über 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)
Und das ist es. Es gibt yaml.load()
auch eine einfache Funktion, die jedoch yaml.safe_load()
immer bevorzugt werden sollte, es sei denn, Sie benötigen ausdrücklich die bereitgestellte Serialisierung / Deserialisierung beliebiger Objekte, um die Möglichkeit der Ausführung von willkürlichem Code zu vermeiden.
Beachten Sie, dass das PyYaml-Projekt Versionen bis zur YAML 1.1-Spezifikation unterstützt . Wenn Unterstützung für die YAML 1.2-Spezifikation benötigt wird, lesen Sie ruamel.yaml, wie in dieser Antwort angegeben .
# -*- 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)
a list:
- 1
- 42
- 3.141
- 1337
- help
- €
a string: bla
another dict:
foo: bar
key: value
the answer: 42
.yml
und .yaml
Für Ihre Anwendung kann Folgendes wichtig sein:
Siehe auch: Vergleich der Datenserialisierungsformate
Wenn Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, sollten Sie meinen kurzen Artikel Konfigurationsdateien in Python lesen
€
unter Windows ist €
. Kennt jemand den Grund?
io.open(doc_name, 'r', encoding='utf8')
, um das Sonderzeichen zu lesen. YAML Version 0.1.7
open(doc_name, ..., encodung='utf8')
zum Lesen und Schreiben verwenden, ohne es zu importieren io
.
Wenn Sie YAML haben, das der YAML 1.2-Spezifikation (veröffentlicht 2009) entspricht, sollten Sie ruamel.yaml verwenden (Haftungsausschluss: Ich bin der Autor dieses Pakets). Es handelt sich im Wesentlichen um eine Obermenge von PyYAML, die den größten Teil von YAML 1.1 (ab 2005) unterstützt.
Wenn Sie in der Lage sein möchten, Ihre Kommentare beim Roundtripping beizubehalten, sollten Sie auf jeden Fall ruamel.yaml verwenden.
Das Upgrade von @ Jons Beispiel ist einfach:
import ruamel.yaml as yaml
with open("example.yaml") as stream:
try:
print(yaml.safe_load(stream))
except yaml.YAMLError as exc:
print(exc)
Verwenden safe_load()
Sie diese Option, es sei denn, Sie haben wirklich die volle Kontrolle über die Eingabe, benötigen sie (selten) und wissen, was Sie tun.
Wenn Sie pathlib Path
zum Bearbeiten von Dateien verwenden, sollten Sie die neue API verwenden, die ruamel.yaml bietet:
from ruamel.yaml import YAML
from pathlib import Path
path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe7 in position 926: ordinal not in range(128)
). Ich habe versucht, yaml.encoding auf utf-8 zu setzen, aber es hat nicht funktioniert, da die Lademethode in YAML immer noch den ascii_decode verwendet. Ist das ein Fehler?
Installieren Sie Pyyaml zuerst mit pip3.
Importieren Sie dann das yaml-Modul und laden Sie die Datei in ein Wörterbuch namens 'my_dict':
import yaml
with open('filename.yaml') as f:
my_dict = yaml.safe_load(f)
Das ist alles was du brauchst. Jetzt befindet sich die gesamte yaml-Datei im Wörterbuch 'my_dict'.
!!python
), kann die Verwendung auch unsicher sein (wie bei einer vollständig gelöschten Festplatte) yaml.load()
. Da dies klar dokumentiert ist, sollten Sie diese Warnung hier wiederholt haben (in fast allen Fällen yaml.safe_load()
kann verwendet werden).
import yaml
, aber das ist kein integriertes Modul, und Sie geben nicht an, um welches Paket es sich handelt. Das Ausführen import yaml
auf einer neuen Python3-Installation führt zuModuleNotFoundError: No module named 'yaml'
Beispiel:
defaults.yaml
url: https://www.google.com
Umwelt.py
from ruamel import yaml
data = yaml.safe_load(open('defaults.yaml'))
data['url']
Ich benutze ruamel.yaml . Details & Debatte hier .
from ruamel import yaml
with open(filename, 'r') as fp:
read_data = yaml.load(fp)
Die Verwendung von ruamel.yaml ist (mit einigen einfachen lösbaren Problemen) mit alten Verwendungen von PyYAML kompatibel und wird, wie in dem von mir angegebenen Link angegeben, verwendet
from ruamel import yaml
anstatt
import yaml
und es wird die meisten Ihrer Probleme beheben.
EDIT : PyYAML ist nicht tot, wie sich herausstellt, es wird nur an einem anderen Ort gepflegt.
#!/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:]))
yaml.safe_load
ist, einen beliebigen Code aus der YAML-Datei auszuführen , es sei denn, Sie möchten beliebige Objekte serialisieren / deserialisieren .