Question

Je veux analyser des documents YAML comme suit

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

---

Plain text/markdown content!
jhaha

Si je load_all cela avec PyYAML, je reçois le texte suivant

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

Ce que je suis en train de réaliser ici est que le fichier YAML doit contenir deux documents, et le second est censé être interprété comme un document unique de chaîne, plus particulièrement tout grand corps de texte avec mise en forme démarquage. Je ne veux pas qu'il soit analysé comme la syntaxe YAML.

Dans l'exemple ci-dessus, PyYAML renvoie le deuxième document en une seule chaîne. Mais si le second document a un caractère : à la place du ! par exemple, je reçois une erreur de syntaxe. En effet, PyYAML est l'analyse de la substance dans ce document.

Est-il possible que je peux dire PyYAML que le deuxième document est juste une chaîne brute et de ne pas l'analyser?

Modifier : Quelques excellentes réponses là-bas. Bien que l'utilisation des guillemets ou la syntaxe littérale permet de résoudre ledit problème, je voudrais les utilisateurs de pouvoir écrire le texte brut sans cochonneries supplémentaire. Tout (ou de -) de trois . et écrire loin un grand corps de texte brut. Ce qui pourrait également inclure des citations aussi. Alors, je voudrais savoir si je peux dire PyYAML pour analyser un seul document, et donner la deuxième me cru.

Eidt 2 : Donc, adapter l'idée de faa, au lieu d'utiliser un essai / sauf que le deuxième document pourrait être valide syntaxe YAML,

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

Merci faa.

Était-ce utile?

La solution

Vous pouvez faire

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)

Si vous ne le contrôle sur le format du document original.

De la documentation PyYAML,

Double-cité est le style le plus puissant et le seul style qui peut exprimer une valeur scalaire . Double-scalaires cités permettent de s'échapper. En utilisant des séquences qui s'échappent \ x ** et \ u ****, vous pouvez exprimer un caractère ASCII ou Unicode.

Il semble donc que il n'y a aucun moyen de représenter un scalaire arbitraire dans l'analyse syntaxique si elle est pas de double cité.

Autres conseils

Si vous voulez simplement échapper au caractère du côlon en YAML, puis enfermer dans simple ou double citations . En outre, vous pouvez essayer le style littéral pour votre deuxième document qui devrait être traité comme seul scalaire.

scroll top