Als Ergänzung zu @Joshbodes ursprünglicher Antwort oben habe ich den Ausschnitt etwas modifiziert, um UNIX-ähnliche Platzhaltermuster zu unterstützen.
Ich habe es jedoch nicht unter Windows getestet. Ich hatte ein Problem damit, ein Array in einem großen YAML über mehrere Dateien aufzuteilen, um die Wartung zu vereinfachen, und suchte nach einer Lösung, um mehrere Dateien in einem Array des Basis-YAML zu referenzieren. Daher die folgende Lösung. Die Lösung unterstützt keine rekursive Referenz. Sie unterstützt nur Platzhalter in einem angegebenen Verzeichnislevel, die im Basis-YAML referenziert werden.
import yaml
import os
import glob
# Basiskode aus dem folgenden Link übernommen:-
# Verweis: https://stackoverflow.com/a/9577670
class Loader(yaml.SafeLoader):
def __init__(self, stream):
self._root = os.path.split(stream.name)[0]
super(Loader, self).__init__(stream)
def include(self, node):
consolidated_result = None
filename = os.path.join(self._root, self.construct_scalar(node))
# Der nachstehende Abschnitt wurde für die Unterstützung von UNIX-Platzhaltermustern modifiziert
filenames = glob.glob(filename)
# Nur um sicherzustellen, dass die Reihenfolge der berücksichtigten Dateien vorhersehbar ist
# und im Fehlerfall leicht zu debuggen ist.
filenames.sort()
for file in filenames:
with open(file, 'r') as f:
result = yaml.load(f, Loader)
if isinstance(result, list):
if not isinstance(consolidated_result, list):
consolidated_result = []
consolidated_result += result
elif isinstance(result, dict):
if not isinstance(consolidated_result, dict):
consolidated_result = {}
consolidated_result.update(result)
else:
consolidated_result = result
return consolidated_result
Loader.add_constructor('!include', Loader.include)
Verwendung
a:
!include a.yaml
b:
# Alle in der b-Ordner ebene enthaltenen YAMLs werden konsolidiert
!include b/*.yaml
2 Stimmen
Ich bin kürzlich auf HiYaPyCo für Python gestoßen, das genau das macht. Sie können verschiedene YAML-Dateien zusammenführen. Es ist ein sehr schönes Python-Modul, das es wert ist, es zu kennen.
0 Stimmen
Siehe auch: stackoverflow.com/questions/41620674/use-placeholders-in-yaml