Domanda

Voglio analizzare i documenti YAML come il seguente

meta-info-1: val1
meta-info-2: val2

---

Plain text/markdown content!
jhaha

Se io load_all questo con PyYAML, ottengo il seguente

>>> list(yaml.load_all(open('index.yml')))
[{'meta-info-1': 'val1', 'meta-info-2': 'val2'}, 'Plain text/markdown content! jhaha']

Quello che sto cercando di fare qui è che il file yaml dovrebbe contenere due documenti, e la seconda dovrebbe essere interpretato come un unico documento di stringa, più precisamente qualsiasi grande corpo di testo con Markdown formattazione. Non voglio che venga analizzato come sintassi YAML.

Nell'esempio precedente, PyYAML restituisce il secondo documento come una singola stringa. Ma se il secondo documento ha un carattere : al posto del ! per esempio, ottengo un errore di sintassi. Questo perché è l'analisi PyYAML la roba in quel documento.

C'è un modo posso dire PyYAML che il secondo documento è una solo una stringa prima e di non analizzarlo?

Modifica : un paio di eccellenti risposte lì. Durante l'utilizzo di citazioni o la sintassi letterale risolve il problema ha detto, mi piacerebbe gli utenti siano in grado di scrivere il testo in chiaro senza alcun cruft supplementare. Proprio le tre - del (o . di) e scrivere via un grande corpo di testo normale. Il che potrebbe anche includere citazioni troppo. Così, mi piacerebbe sapere se posso dire PyYAML per analizzare un solo documento, e dare il secondo a me prima.

Eidt 2 : Quindi, adattando l'idea di AGF, invece di utilizzare un try / se non come il secondo documento potrebbe essere valido sintassi YAML,

config_content, body_content = open(filename).read().split('\n---')
config = yaml.loads(config_content)
body = yaml.loads(body_content)

Grazie AGF.

È stato utile?

Soluzione

Si può fare

raw = open(filename).read()
docs = []
for raw_doc in raw.split('\n---'):
    try:
        docs.append(yaml.load(raw_doc))
    except SyntaxError:
        docs.append(raw_doc)

Se non si avrà il controllo sul formato del documento originale.

Dalla documentazione PyYAML,

Fare doppio citato è lo stile più potente e la solo stile che può esprimere qualsiasi valore scalare . scalari doppio citati permettono la fuga. Utilizzando sequenze di escape \ x ** e \ u ****, si può esprimere qualsiasi ASCII o carattere Unicode.

Così suona come non c'è modo di rappresentare uno scalare arbitrario nel parsing, se non è citato doppio.

Altri suggerimenti

Se invece si è interessati per sfuggire i due punti in YAML, poi racchiuderla tra virgolette singole o doppie . Inoltre, si può provare a stile letterale per il secondo documento che dovrebbe essere trattati come singolo scalare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top