加载文档作为yaml中的原始字符串,带有pyyaml
题
我想像以下内容那样解析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中的结肠角色,然后将其包装在内部 单引号或双引号. 。另外,您可以尝试 字面风格 对于您的第二个文档,应视为单个标量。
不隶属于 StackOverflow