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

时间:2011-07-25 12:38:21

标签: python yaml pyyaml

我想解析yaml文档,如下所示

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

---

Plain text/markdown content!
jhaha

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

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

我在这里想要实现的是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)

谢谢agf。

2 个答案:

答案 0 :(得分: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)

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

来自PyYAML文档,

  

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

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

答案 1 :(得分:2)

如果您想要的只是逃避YAML中的冒号字符,请将其括在单引号或双引号中。此外,您可以尝试literal style作为您的第二个文档,该文档应被视为单个标量。