2011-11-14 22 views
60

Jestem nowy w YAML i szukałem sposobów analizowania pliku YAML i używania/dostępu do danych z przeanalizowanego YAML.Parsowanie pliku YAML w Pythonie i uzyskiwanie dostępu do danych?

mam natknąć wyjaśnienia, w jaki sposób analizować plik YAML, na przykład, z PyYAML tutorial, „How can I parse a YAML file in Python”, „Convert Python dict to object?”, ale to, co jeszcze nie znalazłem prosty przykład, w jaki sposób uzyskać dostęp do danych z sparsowany plik YAML.

Załóżmy Mam plik YAML takich jak:

treeroot: 
    branch1: branch1 text 
    branch2: branch2 text 

Jak mogę uzyskać dostęp do tekstu "tekst branch1"?

"YAML parsing and Python?" zapewnia rozwiązanie, ale miałem problemy z dostępem do danych z bardziej złożonego pliku YAML. Zastanawiam się, czy istnieje jakiś standardowy sposób uzyskiwania dostępu do danych z przeanalizowanego pliku YAML, prawdopodobnie coś podobnego do notacji "tree iteration" lub "elementpath" lub coś, co byłoby używane podczas analizowania pliku XML?

+0

Możliwy duplikat [Jak mogę analizować plik YAML w Pythonie] (https://stackoverflow.com/questions/1773805/how-can-i-parse-a-yaml-file-in-python) – fmsf

Odpowiedz

117

Ponieważ funkcja PyYAML yaml.load() analizuje dokumenty YAML do natywnych struktur danych Pythona, można uzyskać dostęp do elementów według klucza lub indeksu. Na przykładzie z pytaniem jesteś powiązany:

import yaml 
with open('tree.yaml', 'r') as f: 
    doc = yaml.load(f) 

Aby uzyskać dostęp branch1 text użyłbyś:

txt = doc["treeroot"]["branch1"] 
print txt 
"branch1 text" 

, ponieważ w dokumencie YAML, wartość klucza branch1 jest w kluczu treeroot.

+2

I get "TypeError: wskaźniki łańcuchowe muszą być liczbami całkowitymi, a nie str". Wygląda na to, że nie mogę użyć ciągu do indeksu. – sattu

+0

Prawdopodobnie próbujesz uzyskać dostęp do ciągu znaków (indeksowania). Być może idziesz zbyt głęboko; jesteś już w elemencie, do którego próbujesz uzyskać dostęp? – Aphex

+0

@sattu Miałem ten sam błąd, ponieważ nie miałem żadnej spacji między kluczem a wartością, tj. "Labelsize: 20" zamiast "labelsize: 20" – mateuszb

Powiązane problemy