我想像以下内容那样解析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第二个文档只是一个原始字符串而不是解析它?

编辑: :那里有一些出色的答案。在使用引号或文字语法解决上述问题时,我希望用户能够在没有任何额外的cruft的情况下编写纯文本。只是三个 -(或 .'s)并写下了一大批纯文本。这也可能包括报价。因此,我想知道我是否可以告诉Pyyaml只能解析一份文件,然后将第二个文件交给我。

EIDT 2: :因此,适应AGF的想法,而不是使用try/除外,因为第二个文档可能是有效的yaml语法,而是

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

谢谢AGF。

有帮助吗?

解决方案

你可以做

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字符。

因此,听起来如果没有双倍引用,就无法在解析中表示任意标量。

其他提示

如果您想要的只是逃脱YAML中的结肠角色,然后将其包装在内部 单引号或双引号. 。另外,您可以尝试 字面风格 对于您的第二个文档,应视为单个标量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top