我需要使用Python3.7验证YAML文件。我正在尝试Cerberus执行内容验证。至于值验证,这很好,但是对于键名,我找不到在YAML文件的上下文中成功验证其有效性的方法。
词典名称是一个电子邮件地址,并且对于YAML文件中的每个条目都应该是唯一的,并且应该经过验证。几个关键字名称区分大小写,需要经过验证才能正确。
我也是Python的新手,所以很有可能这只是newb的无知。我可能需要查看Cerberus以外的其他地方,但是除此之外,我没有找到一个可靠的YAML验证器。建议非常欢迎。
我按照Cerberus文档创建了schema.py和validationScript.py。我曾尝试放置键盘规则,但似乎无法在该级别进行“ anyof”验证。在我的测试中,按键规则似乎适用于字典中的所有按键。如果我使用密钥规则,则可以验证一个密钥,但其他密钥则失败。我尝试了一系列规则,尝试了anyof和anyof_regex,但无法让它们成功查看所有键名并进行验证。
我找不到验证字典名称的方法。我知道如果我对YAML中存在的有效电子邮件进行硬编码,就可以验证它。
#! python
from cerberus import Validator
import yaml
def __val_users():
with open("yamlfile.yaml", 'r') as stream:
try:
return yaml.safe_load(stream)
except yaml.YAMLError as exception:
print(exception)
schema = eval(open('C:/path/to/schema.py', 'r').read())
v = Validator(schema)
document = __val_users()
print(v.validate(document, schema))
print(v.errors)
schema.py如下所示:
{
'guest@hotpop.com': {
'type': 'dict',
},
'varOn': {
'required': True,
'type': 'string',
'regex': '/^\S*$/;'
},
'varOff': {
'required': True,
'type': 'string',
'regex': '/^\S*$/;'
},
'access': {
'required': True,
'type': 'list',
'allowed': ['h1', 'h2', 'h3', 'oper1', 'oper2', 'oper3', 'drive1', 'drive2', 'drive3']
},
'hub': {
'required': True,
'type': 'list'
}
}
yaml是
me@mydomain.com:
varOn: Single
varOff: Word
access:
- h1
- drive2
- oper3
hub:
- onehub
我希望有可以验证规则的代码,但是使用anyof时我会遇到语法错误: 文件“”,第5行 '任何': ^ SyntaxError:语法无效
使用键盘规则时,我最终会遇到架构错误
File "C:\Python37\lib\site-packages\cerberus\schema.py", line 275, in _validate
raise SchemaError(self.schema_validator.errors)
cerberus.schema.SchemaError: `{'me@mydomain.com': [{'keysrules': ["must be of ['dict', 'string'] type"]}]}`
在所有内容验证正常工作的情况下,我最终得到的字典名称(电子邮件地址)以False开头,{'my@mydomain.com': ['unknown field'], 'stack@exchange.com': ['unknown field']}
答案 0 :(得分:0)
您不能在架构部分中包含一个值,让我们尝试避免在yaml的根中使用电子邮件地址,'key'...看看内部部分并对其进行验证。
await
schema_a.py在同一文件夹中
import yaml
from cerberus import Validator
from schema_a import schema
def __val_users():
with open("/home/sirsk/Active/document.yml", 'r') as stream:
#with open("yamlfile.yaml", 'r') as stream:
try:
return yaml.safe_load(stream)
except yaml.YAMLError as exception:
print(exception)
v = Validator()
document = __val_users()
#you dont know about the email value in this case is the root, key of a dictionary
document = document[next(iter(document))]
if not v.validate(document, schema):
print(v.errors)