在python中验证yaml文档
XML的好处之一是能够根据XSD验证文档。YAML没有此功能,因此如何验证我打开的YAML文档是否符合我的应用程序所需的格式?我不知道有python解决方案。但是有一个用于YAML的ruby模式验证器,名为。如果没有遇到python库,您应该能够使用subprocess访问它。试试看,它有一个python实现。它适用于JSON和YAML 从Rx站点: “在向web服务添加API时,您必须选择如何对跨行发送的数据进行编码。XML是一种常见的选择,但它可能会很快变得晦涩难懂。许多web服务作者希望避免考虑XML,而是选择提供一些与常见数据类型对应的简单数据类型的格式现代编程语言中的数据结构。换句话说,JSON和YAML 不幸的是,虽然这些格式使传递复杂的数据结构变得容易,但它们缺乏一个验证系统。XML有XML模式和RELAX NG,但它们是复杂的,有时令人困惑的标准。它们对于JSON提供的数据结构不是很好的可移植性,如果您想避免将XML作为数据编码,请使用wri使用更多的XML来验证第一个XML可能更不吸引人 Rx旨在提供一个数据验证系统,该系统与JSON样式的数据结构相匹配,并且与JSON本身一样易于使用。”在python中验证yaml文档,python,yaml,validation,Python,Yaml,Validation,XML的好处之一是能够根据XSD验证文档。YAML没有此功能,因此如何验证我打开的YAML文档是否符合我的应用程序所需的格式?我不知道有python解决方案。但是有一个用于YAML的ruby模式验证器,名为。如果没有遇到python库,您应该能够使用subprocess访问它。试试看,它有一个python实现。它适用于JSON和YAML 从Rx站点: “在向web服务添加API时,您必须选择如何对跨行发送的数据进行编码。XML是一种常见的选择,但它可能会很快变得晦涩难懂。许多web服务作者希望避
是-对验证的支持对于许多重要用例来说是至关重要的。见例 如前所述,对于各种语言以及Ruby和Java,都有可用的 另请参见Pyaml讨论:
一项相关的工作是,它甚至有一些IETF标准化活动()这些看起来不错。yaml解析器可以处理语法erorrs,其中一个库可以验证数据结构
- (我试过这个,虽然有点稀疏,但还不错。)
- (乍一看不清楚如何验证文件)
这样做的一个问题是,如果您的模式跨越多个文件,并且您使用
“$ref”
引用其他文件,那么我认为这些其他文件将需要是JSON。但可能有办法解决这个问题。在我自己的项目中,我正在使用JSON文件指定模式,而实例是YAML。我也遇到了同样的情况。我需要验证YAML的元素
首先,我认为“PyYAML标签”是最好的简单方法。但后来决定使用“PyKwalify”,它实际上为YAML定义了一个模式
PyYAML标签:
YAML文件有一个标记支持,我们可以通过为数据类型添加前缀来强制执行这种基本检查。(例如)对于整数-!!int“123”
关于Pyaml的更多信息:
这是好的,但是如果您要向最终用户公开它,那么它可能会引起混乱。
我做了一些研究来定义YAML的模式。这个想法就像我们可以验证YAML及其相应的模式,以进行基本数据类型检查。甚至我们的自定义验证(如IP地址)也可以添加随机字符串。因此,我们可以单独使用模式,使YAML简单易读
我无法发布更多链接。请“google schema for YAM”查看模式讨论
PyKwalify:
有一个名为PyKwalify的包,用于此目的:
这个包裹最符合我的要求。
我在本地的一个小例子中尝试了这一点,并且正在发挥作用。下面是示例模式文件
#sample schema
type: map
mapping:
Emp:
type: map
mapping:
name:
type: str
required: yes
email:
type: str
age:
type: int
birth:
type: str
此架构的有效YAML文件
---
Emp:
name: "abc"
email: "xyz@gmail.com"
age: yy
birth: "xx/xx/xxxx"
谢谢您可以使用python的yaml库来显示加载文件的message/char/line/file
#!/usr/bin/env python
import yaml
with open("example.yaml", 'r') as stream:
try:
print(yaml.load(stream))
except yaml.YAMLError as exc:
print(exc)
可以通过exc.problem访问错误消息
访问exc.problem\u标记
以获取
对象
此对象允许您访问属性
- 名字
- 纵队
- 线
pm = exc.problem_mark
print("Your file {} has an issue on line {} at position {}".format(pm.name, pm.line, pm.column))
我发现它非常可靠,有很好的文档,而且使用简单
下面是一个基本的实现示例:
my_yaml.yaml
:
name:“我的名字”
日期:2017-10-01
韵律学:
百分比:
价值:87
趋势:稳定
在schema.py
中定义验证架构:
{
“姓名”:{
“必需”:True,
“类型”:“字符串”
},
“日期”:{
“必需”:True,
“类型”:“日期”
},
“指标”:{
“必需”:True,
'type':'dict',
“架构”:{
“百分比”:{
“必需”:True,
'type':'dict',
“架构”:{
“价值”:{
“必需”:True,
“类型”:“编号”,
“min”:0,
“最大”:100
},
“趋势”:{
'类型':'字符串',
“nullable”:True,
“regex”:“^(?i)(向下|相等|向上)$”
}
}
}
}
}
}
使用加载yaml
文档:
导入yaml
def load_doc():
以open('./my_yaml.yaml',r')作为流:
尝试:
返回yaml.load(流)
除了yaml.YAMLError作为例外:
引发异常
##现在,验证yaml文件非常简单:
来自cerberus导入验证程序
schema=eval(打开('./schema.py',r').read())
v=验证器(模式)
doc=加载_doc()
打印(v.validate(文档、架构))
打印(v.错误)
请记住,Cerberus是一个不可知的数据验证工具,这意味着它可以支持YAM以外的格式
pm = exc.problem_mark
print("Your file {} has an issue on line {} at position {}".format(pm.name, pm.line, pm.column))
import ytools
ytools.validate("test/sampleschema.yaml", ["test/sampledata.yaml"])
from schema import Schema, And, Use, Optional, SchemaError
import yaml
schema = Schema(
{
'created': And(datetime.datetime),
'author': And(str),
'email': And(str),
'description': And(str),
Optional('tags'): And(str, lambda s: len(s) >= 0),
'setup': And(list),
'steps': And(list, lambda steps: all('=>' in s for s in steps), error='Steps should be array of string '
'and contain "=>" to separate'
'actions and expectations'),
'teardown': And(list)
}
)
with open(filepath) as f:
data = yaml.load(f)
try:
schema.validate(data)
except SchemaError as e:
print(e)