使用PyYAML将文档作为原始字符串加载到yaml中

Shr*_*rat 9 python yaml pyyaml

我想解析下面的yaml文档

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

---

Plain text/markdown content!
jhaha
Run Code Online (Sandbox Code Playgroud)

如果我load_all使用PyYAML,我会得到以下内容

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

我在这里想要实现的是yaml文件应该包含两个文档,第二个应该被解释为单个字符串文档,更具体地说是任何带有markdown格式的大文本.我不希望它被解析为YAML语法.

在上面的示例中,PyYAML将第二个文档作为单个字符串返回.但是如果第二个文档有一个:字符代替!例如,我会收到语法错误.这是因为PyYAML正在解析该文档中的内容.

有没有办法告诉PyYAML第二个文件只是一个原始字符串而不是解析它?

编辑:那里有一些很好的答案.虽然使用引号或文字语法解决了上述问题,但我希望用户能够在没有任何额外错误的情况下编写纯文本.只是三个-(或.'s)并写下大量纯文本.其中也可能包含引号.所以,我想知道我是否可以告诉PyYAML只解析一个文档,然后给我第二个文档.

Eidt 2:所以,调整agf的想法,而不是使用try/except,因为第二个文档可能是有效的yaml语法,

config_content, body_content = open(filename).read().split('\n---')
config = yaml.loads(config_content)
body = yaml.loads(body_content)
Run Code Online (Sandbox Code Playgroud)

谢谢agf.

agf*_*agf 5

你可以做

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)
Run Code Online (Sandbox Code Playgroud)

如果您无法控制原始文档的格式.

从PyYAML文档中,

Double-quoted是最强大的风格,也是唯一可以表达任何标量值的风格.双引号标量允许转义.使用转义序列\ x**和\ u****,您可以表达任何ASCII或Unicode字符.

所以听起来如果不是双引号就没有办法在解析中表示任意标量.