1105 Stimmen

Wie kann ich eine YAML-Datei in Python parsen?

Wie kann ich eine YAML-Datei in Python parsen?

1446voto

Jon Punkte 58858

Die einfachste und reinste Methode, ohne sich auf C-Header zu verlassen, ist PyYaml ( Dokumentation ), die ü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 war's. Einfarbig yaml.load() Funktion gibt es auch, aber yaml.safe_load() sollte immer vorgezogen werden, um die Möglichkeit der Ausführung von beliebigem Code zu vermeiden. Wenn Sie also nicht explizit die Serialisierung/Deserialisierung beliebiger Objekte benötigen, verwenden Sie safe_load .

Beachten Sie, dass das PyYaml-Projekt Versionen bis zur YAML 1.1-Spezifikation . Wenn YAML 1.2 Spezifikation Unterstützung benötigt wird, siehe ruamel.yaml wie vermerkt in diese Antwort .

Sie könnten auch einen Drop-in-Ersatz für pyyaml verwenden, der Ihre yaml-Datei geordnet hält so wie du es hattest , genannt oyaml . Siehe Synchro von oyaml hier

166 Stimmen

Ich würde hinzufügen, dass, es sei denn, Sie wollen zu serialisieren/deserialisieren beliebige Objekte, ist es besser, zu verwenden yaml.safe_load da er keinen beliebigen Code aus der YAML-Datei ausführen kann.

4 Stimmen

Yaml yaml = new Yaml(); Object obj = yaml.load("a: 1 \nb : 2 \nc : \n - aaa \n - bbb");

3 Stimmen

Mir gefällt der Artikel von moose: martin-thoma.com/konfigurationsdateien-in-python

234voto

Martin Thoma Punkte 105621

Lesen und Schreiben von YAML-Dateien mit Python 2+3 (und 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)

Erstellte YAML-Datei

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

Gemeinsame Dateiendungen

.yml y .yaml

Alternativen

Für Ihre Bewerbung könnten folgende Punkte wichtig sein:

  • Unterstützung durch andere Programmiersprachen
  • Lese-/Schreibleistung
  • Kompaktheit (Dateigröße)

Siehe auch: Vergleich von Formaten zur Serialisierung von Daten

Falls Sie eher nach einer Möglichkeit suchen, Konfigurationsdateien zu erstellen, sollten Sie meinen kurzen Artikel lesen Konfigurationsdateien in Python

0 Stimmen

Welche Kodierung hat die Datei? Sind Sie sicher, dass sie utf-8 kodiert ist?

1 Stimmen

Danke für die Anregung. Meine Datei hat utf-8 Kodierung. Ich musste Ihre Codezeile ändern in io.open(doc_name, 'r', encoding='utf8') um das Sonderzeichen zu lesen. YAML Version 0.1.7

0 Stimmen

Hm, interessant. Ich werde morgen versuchen, das zu reproduzieren und werde die Frage anpassen, wenn ich kann. Ich danke Ihnen!

87voto

Anthon Punkte 58254

Wenn Sie YAML haben, das dem YAML 1.2 Spezifikation (veröffentlicht 2009), dann sollten Sie ruamel.yaml (Haftungsausschluss: Ich bin der Autor dieses Pakets). Es ist im Wesentlichen eine Obermenge von PyYAML, das den größten Teil von YAML 1.1 (von 2005) unterstützt.

Wenn Sie in der Lage sein wollen, Ihre Kommentare beim Roundtrip zu erhalten, sollten Sie auf jeden Fall ruamel.yaml verwenden.

Das Beispiel von @Jon ist leicht zu verbessern:

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 Sie safe_load() es sei denn, Sie haben wirklich die volle Kontrolle über die Eingabe, brauchen sie (was selten der Fall ist) und wissen, was Sie tun.

Wenn Sie pathlib verwenden Path für die Bearbeitung von Dateien zu verwenden, ist es besser, die neue API ruamel.yaml zu nutzen:

from ruamel.yaml import YAML
from pathlib import Path

path = Path('example.yaml')
yaml = YAML(typ='safe')
data = yaml.load(path)

0 Stimmen

Hallo @Anthon. Ich habe ruamels verwendet, aber ich habe ein Problem mit Dokumenten, die nicht ascii-kompatibel sind ( 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 das hat nicht funktioniert, da die Load-Methode in YAML immer noch den ascii_decode verwendet. Ist dies ein Fehler?

63voto

Pal Punkte 842

Installieren Sie zunächst pyyaml mit pip3.

Dann importieren Sie das Modul yaml 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 Sie brauchen. Jetzt befindet sich die gesamte yaml-Datei im Wörterbuch "my_dict".

3 Stimmen

Wenn Ihre Datei die Zeile "- hello world" enthält, ist es unangebracht, die Variable my_dict aufzurufen, da sie eine Liste enthalten wird. Wenn die Datei bestimmte Tags enthält (beginnend mit !!python ), kann es auch unsicher sein (wie bei einer komplett gelöschten Festplatte), die yaml.load() . Da dies eindeutig dokumentiert ist, hätten Sie diese Warnung hier wiederholen sollen (in fast allen Fällen yaml.safe_load() verwendet werden kann).

6 Stimmen

Sie verwenden import yaml aber das ist kein eingebautes Modul, und Sie geben nicht an, um welches Paket es sich handelt. Ausführen von import yaml bei einer frischen Python3-Installation ergibt ModuleNotFoundError: No module named 'yaml'

0 Stimmen

Voir Munch , stackoverflow.com/questions/52570869/ import yaml; from munch import munchify; f = munchify(yaml.load(…)); print(fo.d.try)

17voto

rinkush sharda Punkte 181

Um auf ein beliebiges Element einer Liste in einer YAML-Datei zuzugreifen, gehen Sie wie folgt vor:

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

Sie können das folgende Python-Skript verwenden:

import yaml

with open("/some/path/to/yaml.file", 'r') as f:
    valuesYaml = yaml.load(f, Loader=yaml.FullLoader)

print(valuesYaml['global']['dbConnectionString'])

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X