我想解析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。
答案 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作为您的第二个文档,该文档应被视为单个标量。