12

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

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

---

Plain text/markdown content!
jhaha

如果我load_all使用 PyYAML,我会得到以下信息

>>> 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 第二个文档只是一个原始字符串而不是解析它?

编辑:那里有一些很好的答案。虽然使用引号或文字语法解决了上述问题,但我希望用户能够编写纯文本而无需任何额外的麻烦。只需三个-(或.)并写下一大段纯文本。其中也可能包括引号。所以,我想知道我是否可以告诉 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。

4

2 回答 2

6

你可以做

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 文档中,

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

因此,如果它不是双引号,听起来好像没有办法在解析中表示任意标量。

于 2011-07-25T12:55:55.073 回答
2

如果您只想在 YAML 中转义冒号字符,请将其括在单引号或双引号中。此外,您可以尝试将第二个文档视为单个标量的文字样式。

于 2011-07-25T12:49:28.907 回答