Python 用PyYaml解析可能无效的YAML
我想用pyyaml解析一个与puppet相关的yaml配置。不幸的是,由于以下原因,pyyaml似乎无法解析某些YAML文件:Python 用PyYaml解析可能无效的YAML,python,yaml,puppet,pyyaml,hiera,Python,Yaml,Puppet,Pyyaml,Hiera,我想用pyyaml解析一个与puppet相关的yaml配置。不幸的是,由于以下原因,pyyaml似乎无法解析某些YAML文件: base::files: /var/log/fpm: ensure: 'directory' mode: '777' /etc/nginx/ssl/cert: ensure: 'directory' /apps: ensure: 'directory' owner: user group: user ['/
base::files:
/var/log/fpm:
ensure: 'directory'
mode: '777'
/etc/nginx/ssl/cert:
ensure: 'directory'
/apps:
ensure: 'directory'
owner: user
group: user
['/apps/ecert-public', '/apps/ecert-public/config', '/apps/ecert-public/releases']:
ensure: 'directory'
owner: 'user'
group: 'user'
['/apps/site-public', '/apps/site-public/config', '/apps/site-public/releases']:
ensure: 'directory'
owner: 'user'
group: 'user'
问题在于具有多个值的映射(在方括号内)。尝试使用pyyaml解析此部分时,我收到以下错误消息:
在中构造映射时
“/hieradata/node/wc-de.yaml”,
第133行第3列中发现不可损坏的键
“/hieradata/node/wc-de.yaml”,
第212行第3栏
一些YAML验证器说这是有效的YAML(如:),但我尝试过的大多数验证器在解析这一部分时也有问题。有人知道我如何用Pyaml解决这个问题吗不幸的是,我无法更改YAML本身,因此我需要一个解决方案来解析它。这是完全有效的YAML。问题出在皮亚姆身上。正如我所知的所有其他未能加载该文件的YAML处理器一样,它可以毫无问题地解析该YAML(如果处理器实现了该步骤,则可以编写),但在加载过程的构造步骤中失败 如果您想使用
ruamel.yaml
(免责声明:我是该软件包的作者)并听取您的意见
在文件input.yaml
中:
import sys
from pathlib import Path
import ruamel.yaml
file_name = Path('input.yaml')
yaml = ruamel.yaml.YAML()
data = yaml.load(file_name)
print(data['base::files'][('/apps/ecert-public', '/apps/ecert-public/config', '/apps/ecert-public/releases')]['ensure'])
print('\n-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-\n')
yaml.dump(data, sys.stdout)
给出:
directory
-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-o-
base::files:
/var/log/fpm:
ensure: directory
mode: '777'
/etc/nginx/ssl/cert:
ensure: directory
/apps:
ensure: directory
owner: user
group: user
[/apps/ecert-public, /apps/ecert-public/config, /apps/ecert-public/releases]:
ensure: directory
owner: user
group: user
[/apps/site-public, /apps/site-public/config, /apps/site-public/releases]:
ensure: directory
owner: user
group: user
任何映射都可以有多个值。这里有一个键不是标量而是序列的映射,这是有效的YAML,但PyYAML不能处理的事情之一。YAML对映射键没有限制,只是它们是唯一的。特别是,它不要求它们是标量。然而,我敦促您重新考虑是否可以修改YAML的问题。从它的结构来看,我怀疑它可以被重写,这对使用它的Puppet模块来说意味着同样的事情,但对YAML解析器来说并不是那么具有挑战性。@Anthon,许多YAML处理器在OP的有效代码上失败。他们失败的原因其实并不重要。您可以选择您想要描述这种情况的形容词,但我选择“挑战”。我刚刚认识到您的模块似乎有类似的问题:如果YAML文件包含重复的映射,则会发生异常-例如,如果它看起来像这样:`base::test value:key base::test value key`但是。。。这对我来说不是什么问题。只是想让你知道。如果你是指映射中的重复键,那在YAML 1.2中是不允许的。在YAML 1.1中,允许解析器发出警告并保留第一个键/值对。您可以通过以下方式允许1.1行为: