我已经添加了折叠字符串的表示符,如Python中的任何yaml库中提到的文字字符串,支持将长字符串转储为块文字或折叠块?.我还添加了representer来在转储的yaml内容中以块样式打印列表.
但问题是当字符串为空时,即""或列表为空时,它们在转储的YAML内容中以非块样式出现.
如何强制pyyaml转储器输出带有">"或"|"的空字符串 生成的YAML内容中的块样式中的flow_style = False的样式和空列表?
我有一些单元测试,并希望将每个测试运行的结果存储为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) 我想知道是否有可能执行嵌入在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代码,但是没有描述如何实际执行嵌入的代码。
看起来 PyYAML 将字符串 10:01 解释为以秒为单位的持续时间:
import yaml
>>> yaml.load("time: 10:01")
{'time': 601}
Run Code Online (Sandbox Code Playgroud)
官方文档没有反映:PyYAML 文档
任何建议如何将 10:01 读作字符串?
我有一个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 来完成此任务。在此先感谢您的帮助。
我在加载带有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) 我想用 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 本身,所以我需要一个解决方案来解析它是如何的。
如何遍历:
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)
我想在同一个地方添加A3A1A和A3A1B和其他值的值
我尝试了以下方法:
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)
但这不起作用
这是我的代码:
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?
好吧,我正在尝试读取带有和 的utf-8目录中的 yaml 文件集合。我尝试使用,但它实际上返回一个文件列表,我需要读取文件并显示内容(键,值)。该目录只有 yaml 文件,并且 pyyaml 库已安装。python 2.7pyyamlos.listdir(os.getcwd())
yaml 文件的所有内容都类似于:
fruits:
- bananas
- apples
- grapes
Run Code Online (Sandbox Code Playgroud)
谁能帮我?
pyyaml ×10
yaml ×8
python ×7
django ×1
dump ×1
empty-list ×1
hiera ×1
puppet ×1
python-2.7 ×1
python-3.x ×1
ruby ×1
security ×1
string ×1
warnings ×1
wtforms ×1