Pregunta

Quiero analizar yaml documentos como los siguientes

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

---

Plain text/markdown content!
jhaha

Si Me load_all esto con PyYAML, me sale el siguiente

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

Lo que estoy tratando de lograr aquí es que los archivos yaml debe contener dos documentos, y el segundo se supone que uno debe ser interpretado como una sola cadena documento, más específicamente cualquier gran cuerpo de texto con formato markdown.No quiero ser analizado como YAML sintaxis.

En el ejemplo anterior, PyYAML devuelve el segundo documento como una sola cadena.Pero si el segundo documento tiene un : carácter en lugar de la ! por ejemplo, me sale un error de sintaxis.Esto es debido a que PyYAML es analizar las cosas en ese documento.

Hay una manera que puedo decir PyYAML que el segundo documento es solo una cadena sin formato y no para analizarlo?

Editar:Un par de excelentes respuestas allí.Mientras que el uso de comillas o la sintaxis literal resuelve dicho problema, me gustaría que los usuarios puedan escribir el texto sin ningún resto adicional.Sólo el tres -'s (o .'s) y escritura de distancia de un gran cuerpo de texto sin formato.Que también podría incluir citas también.Así, me gustaría saber si me pueden decir PyYAML a analizar sólo un documento, y darle la segunda a mí raw.

Eidt 2:Así, la adaptación de la agf la idea de, en lugar de utilizar un try/except como el segundo documento podría ser válida yaml sintaxis,

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

Gracias agf.

¿Fue útil?

Solución

Tu puedes hacer

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 no tendrá control sobre el formato del documento original.

De los documentos de Pyyaml,

Double-coted es el estilo más poderoso y el solo estilo que puede expresar cualquier valor escalar. Los escalares de doble cotización permiten escapar. Usando secuencias de escape x ** y u ****, puede expresar cualquier carácter ASCII o unicode.

Por lo tanto, parece que no hay forma de representar un escalar arbitrario en el análisis si no se cita doble.

Otros consejos

Si todo lo que quieres es escapar del personaje de colon en Yaml, entonces encerrarlo dentro Cotizaciones simples o dobles. Además, puedes probar estilo literal para su segundo documento que debe tratarse como un solo escalar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top