Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用PyYaml解析可能无效的YAML_Python_Yaml_Puppet_Pyyaml_Hiera - Fatal编程技术网

Python 用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 ['/

我想用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解析此部分时,我收到以下错误消息:

在中构造映射时 “/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行为: