使用 PyYaml 解析可能无效的 YAML
Parsing probably invalid YAML with PyYaml
我想用 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
['/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 解析此部分时收到以下错误消息:
while constructing a mapping in
"/hieradata/node/wc-de.yaml",
line 133, column 3 found unhashable key in
"/hieradata/node/wc-de.yaml",
line 212, column 3
一些 YAML 验证器说这是有效的 YAML(例如:http://www.yamllint.com/),但我试过的大多数验证器在解析这部分时也有问题。有谁知道我如何用 pyyaml 解决这个问题? 不幸的是我无法更改 YAML 本身,所以我需要一个解决方案来解析它。
这是完全有效的 YAML。问题出在 PyYAML 上。像所有其他无法加载它的 YAML 处理器一样,据我所知,它可以 parse YAML 没有问题(如果处理器实现 compose该步骤),但在加载过程的构建步骤中失败。
如果你会使用 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
我想用 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
['/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 解析此部分时收到以下错误消息:
while constructing a mapping in "/hieradata/node/wc-de.yaml", line 133, column 3 found unhashable key in "/hieradata/node/wc-de.yaml", line 212, column 3
一些 YAML 验证器说这是有效的 YAML(例如:http://www.yamllint.com/),但我试过的大多数验证器在解析这部分时也有问题。有谁知道我如何用 pyyaml 解决这个问题? 不幸的是我无法更改 YAML 本身,所以我需要一个解决方案来解析它。
这是完全有效的 YAML。问题出在 PyYAML 上。像所有其他无法加载它的 YAML 处理器一样,据我所知,它可以 parse YAML 没有问题(如果处理器实现 compose该步骤),但在加载过程的构建步骤中失败。
如果你会使用 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