Wie kann ich eine YAML-Datei in Python analysieren?
611
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 .
yaml.safe_load
ist, einen beliebigen Code aus der YAML-Datei auszuführen , es sei denn, Sie möchten beliebige Objekte serialisieren / deserialisieren .pip install pyyaml
Weitere Optionen finden Sie inLesen und Schreiben von YAML-Dateien mit Python 2 + 3 (und Unicode)
Erstellte YAML-Datei
Allgemeine Dateienden
.yml
und.yaml
Alternativen
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
quelle
€
unter Windows ist€
. Kennt jemand den Grund?io.open(doc_name, 'r', encoding='utf8')
, um das Sonderzeichen zu lesen. YAML Version 0.1.7open(doc_name, ..., encodung='utf8')
zum Lesen und Schreiben verwenden, ohne es zu importierenio
.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:
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:quelle
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':
Das ist alles was du brauchst. Jetzt befindet sich die gesamte yaml-Datei im Wörterbuch 'my_dict'.
quelle
!!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ällenyaml.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ührenimport yaml
auf einer neuen Python3-Installation führt zuModuleNotFoundError: No module named 'yaml'
Beispiel:
quelle
Ich benutze ruamel.yaml .
Details & Debatte hier.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
anstatt
und es wird die meisten Ihrer Probleme beheben.
EDIT : PyYAML ist nicht tot, wie sich herausstellt, es wird nur an einem anderen Ort gepflegt.
quelle
quelle