标签: pyyaml

在Pyyaml中,如何用块样式表示空字符串和列表?

我已经添加了折叠字符串的表示符,如Python中的任何yaml库中提到的文字字符串,支持将长字符串转储为块文字或折叠块?.我还添加了representer来在转储的yaml内容中以块样式打印列表.

但问题是当字符串为空时,即""或列表为空时,它们在转储的YAML内容中以非块样式出现.

如何强制pyyaml转储器输出带有">"或"|"的空字符串 生成的YAML内容中的块样式中的flow_style = False的样式和空列表?

string yaml dump pyyaml empty-list

2
推荐指数
1
解决办法
1793
查看次数

在pyyaml中表示具有相同基类的不同类的实例

我有一些单元测试,并希望将每个测试运行的结果存储为YAML文件以供进一步分析.YAML格式的转储数据以多种方式满足我的需求.但测试属于不同的西装,结果有不同的父类,这是我的例子:

>>> rz # shorthand for result
[<upstream_suite.fftest.SimpleTest testMethod=test_is_fsType_not_set>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_A>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_A_a_glyph_instance>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_ended_ufo>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_folder>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_is_fsType_eq_1>,
<upstream_suite.openfolder.UfoOpenTest testMethod=test_it_exists>]
# etc.
Run Code Online (Sandbox Code Playgroud)

每个测试都可以有自己的父类.

>>> type(rz[0]) == type(rz[1])
False
Run Code Online (Sandbox Code Playgroud)

我已经使用__getstate__方法为所有类添加了我自己的基类,但由于某些原因它不起作用:

>>> rz[0].__getstate__()
{'targets': ['upstream'], 'methodDoc': 'Is the OS/2 table fsType set to 0?', 'methodName': 'test_is_fsType_not_set', 'tool': 'FontForge', 'name': 'upstream_suite.fftest'}
>>> yaml.safe_dump(rz[0])
*** RepresenterError: cannot represent an object: test_is_fsType_not_set (upstream_suite.fftest.SimpleTest)
Run Code Online (Sandbox Code Playgroud)

Documentations说我可以为每个类创建代表,所以我尝试了并编写了这段代码:

import yaml
from somepath import MyTestCase

def repr_testcase(dumper, data):
    return dumper.represent_mapping(u'tag:yaml.org,2002:map', {
        'methodDoc': data._testMethodDoc,
        'tool': data.tool,
        'name': data.name, …
Run Code Online (Sandbox Code Playgroud)

python yaml pyyaml

2
推荐指数
1
解决办法
787
查看次数

执行YAML文件中嵌入的Python代码

我想知道是否有可能执行嵌入在YAML文件中的Python代码。例如,我的YAML文件当前包含一个列表:

list: [1,2,3,4]
Run Code Online (Sandbox Code Playgroud)

但是我更愿意使用numpy在我的YAML文件中输入以下列表:

list: np.arange(1,5)
Run Code Online (Sandbox Code Playgroud)

我看到了“ 如何将Python代码嵌入到YAML中? ”,它描述了如何使用文字标量块样式来嵌入Python代码,但是没有描述如何实际执行嵌入的代码。

python yaml pyyaml

2
推荐指数
1
解决办法
4558
查看次数

PyYAML 将字符串解释为时间戳

看起来 PyYAML 将字符串 10:01 解释为以秒为单位的持续时间:

import yaml
>>> yaml.load("time: 10:01")
{'time': 601}
Run Code Online (Sandbox Code Playgroud)

官方文档没有反映:PyYAML 文档

任何建议如何将 10:01 读作字符串?

python pyyaml

2
推荐指数
1
解决办法
1601
查看次数

通过解析yaml文件创建表单

我有一个yaml文件如下

name:
    property_type: string
    mandatory: True
    default: None
    help: your full name

address:
    city:
        property_type: string
        mandatory: True
        default: None
        help: city

    state:
        property_type: string
        mandatory: True
        default: None
        help: state
Run Code Online (Sandbox Code Playgroud)

我想要做的是解析此文件以创建一个表单类(可由 Django 或 WT-Forms 使用)来创建 Web 表单。

我不能简单地创建类,因为只要更新 yaml 配置文件,表单(以及类)就需要自动更新。

我目前正在尝试使用 pyyaml 来完成此任务。在此先感谢您的帮助。

django pyyaml wtforms flask-wtforms

2
推荐指数
1
解决办法
4064
查看次数

pyyaml将mac地址转换为数字

我在加载带有mac地址的yaml文件时遇到了这个奇怪的问题,其中地址转换为数字.

>>> yaml.safe_load('abc: 11:00:00:00:00:00')
{'abc': 8553600000}
>>> yaml.safe_load('abc: 99:00:00:00:00:00')
{'abc': 76982400000}
Run Code Online (Sandbox Code Playgroud)

但后来我尝试了以下,我得到了预期的答案.

>>> yaml.safe_load('abc: ff:00:00:00:00:00')
{'abc': 'ff:00:00:00:00:00'}
Run Code Online (Sandbox Code Playgroud)

我知道解决方案是将mac地址放在引号内,但我想知道这种行为的原因.

有趣的是,我用ruby尝试了相同的数据并得到了类似的结果.

编辑

在仅使用数字的情况下添加新的测试数据

>>> yaml.load('abc: 52:00:00:60:00:00')
{'abc': '52:00:00:60:00:00'}
Run Code Online (Sandbox Code Playgroud)

ruby python yaml pyyaml

2
推荐指数
1
解决办法
289
查看次数

使用 PyYaml 解析可能无效的 YAML

我想用 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'
Run Code Online (Sandbox Code Playgroud)

问题是具有多个值的映射(在方括号内)。尝试使用 pyyaml 解析此部分时收到以下错误消息:

在“/hieradata/node/wc-de.yaml”第 133 行第 3 列中构建映射时,在“/hieradata/node/wc-de.yaml”第 212 行第 3 列中发现不可哈希键

一些 YAML 验证器说这是有效的 YAML(例如:http : //www.yamllint.com/),但我尝试过的大多数验证器在解析这部分时也有问题。有谁知道我如何用 pyyaml 解决这个问题?不幸的是我不能改变 YAML 本身,所以我需要一个解决方案来解析它是如何的。

python yaml puppet pyyaml hiera

2
推荐指数
1
解决办法
541
查看次数

Python 遍历 YAML

如何遍历:

A:
  A1: 1000
  A2:
    A2A:
      A2A1: 100
      A2A2: 250
      A2A3: 250
    A2B:
      A2B1: 100
      A2B2: 300
   A3:
     A3A:
       A3A1:
         A3A1A: 200
         A3A1B: 100
         # There could be more values
Run Code Online (Sandbox Code Playgroud)

我想在同一个地方添加A3A1AA3A1B和其他值的值

我尝试了以下方法:

    with open("foobar.yml", 'r') as stream:
            foobar = yaml.load(stream)
    end_value = 0
        for one_value in foobar["A1"]["A3"]["A3A"] ["A3A1"][*]:
           end_value = end_value + one_value 
Run Code Online (Sandbox Code Playgroud)

但这不起作用

python yaml pyyaml

2
推荐指数
1
解决办法
4112
查看次数

当默认加载器已经变得更加安全时,为什么PyYAML 5.1会引发YAMLLoadWarning?

这是我的代码:

import yaml
yaml.load('foo')
Run Code Online (Sandbox Code Playgroud)

此代码导致PyYAML(5.1)出现以下警告。

$ pip install pyyaml
$ python3 foo.py
foo.py:2: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.
  yaml.load('foo')
Run Code Online (Sandbox Code Playgroud)

因此,我访问了https://msg.pyyaml.org/load来了解这是怎么回事,但我不了解此警告的必要性。

首先,文档说,

UnsafeLoader(也要求Loader向后兼容)

不受信任的数据输入可以轻易利用的原始Loader代码。

好的,那很有道理。在早期版本中,原始加载程序是不安全的。此外,它说,

FullLoader

加载完整的YAML语言。避免执行任意代码。当前(PyYAML 5.1)是yaml.load(input)(在发出警告之后)调用的默认加载程序。

因此,当前版本使用FullLoader的不是不安全的。在文档中再次确认。

通过禁止默认加载器()执行任意功能,还使加载函数更加安全FullLoader

如果使用的当前版本FullLoader不是不安全的,那么为什么我们完全需要它YAMLLoadWarning

security warnings yaml pyyaml python-3.x

2
推荐指数
1
解决办法
4428
查看次数

如何读取/解析目录中的所有 yaml 文件?

好吧,我正在尝试读取带有和 的utf-8目录中的 yaml 文件集合。我尝试使用,但它实际上返回一个文件列表,我需要读取文件并显示内容(键,值)。该目录只有 yaml 文件,并且 pyyaml 库已安装。python 2.7pyyamlos.listdir(os.getcwd())

yaml 文件的所有内容都类似于:

fruits:
 - bananas
 - apples
 - grapes
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

python yaml pyyaml python-2.7

2
推荐指数
1
解决办法
1万
查看次数