2011-11-14 15 views
60

Sono nuovo di YAML e ho cercato modi per analizzare un file YAML e utilizzare/accedere ai dati dallo YAML analizzato.Analizzare un file YAML in Python e accedere ai dati?

mi sono imbattuto spiegazioni su come analizzare il file YAML, ad esempio, il PyYAML tutorial, "How can I parse a YAML file in Python", "Convert Python dict to object?", ma quello che non ho trovato è un semplice esempio su come accedere ai dati da il file YAML analizzato.

Si supponga che ho un file YAML come ad esempio:

treeroot: 
    branch1: branch1 text 
    branch2: branch2 text 

Come posso accedere al testo "Branch1 testo"?

"YAML parsing and Python?" fornisce una soluzione, ma ho avuto problemi ad accedere ai dati da un file YAML più complesso. E mi chiedo se ci sia un modo standard per accedere ai dati da un file YAML analizzato, possibilmente qualcosa di simile alla notazione "tree iteration" o "elementpath" o qualcosa che verrebbe utilizzato durante l'analisi di un file XML?

+0

Possibile duplicato di [Come posso analizzare un file YAML in Python] (https://stackoverflow.com/questions/1773805/how-can-i-parse-a-yaml-file-in-python) – fmsf

risposta

117

Poiché la funzione yaml.load() di PyYAML analizza i documenti YAML in strutture di dati Python native, è sufficiente accedere agli elementi per chiave o indice. Utilizzando l'esempio dalla questione si è collegato:

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

Per accedere branch1 text si usa:

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

perché, nel documento YAML, il valore della chiave branch1 è sotto la chiave treeroot.

+2

I get "TypeError: gli indici stringa devono essere interi, non str". Sembra che non possa usare la stringa per l'indice. – sattu

+0

Probabilmente stai tentando di accedere (indicizzazione in) a una stringa. Potresti andare troppo in profondità; sei già all'elemento a cui stai tentando di accedere? – Aphex

+0

@sattu Ho avuto lo stesso errore perché non avevo nessuno spazio tra la chiave e il valore, cioè "labelsize: 20" invece di "labelsize: 20" – mateuszb

Problemi correlati