我需要使用 Python3.7 验证 YAML 文件。我正在尝试 Cerberus 执行内容验证。至于值验证,它工作得很好,但对于键名,我找不到在 YAML 文件的上下文中成功验证其有效性的方法。
字典名称是一个电子邮件地址,对于 YAML 文件中的每个条目都应该是唯一的,并且应该经过验证。一些键名区分大小写,需要验证是否准确。
我也是 Python 的新手,所以很有可能这只是新手的无知。我可能需要寻找 Cerberus 以外的其他地方,但我还没有找到一个强大的 YAML 验证器。非常欢迎提出建议。
我按照 Cerberus 文档创建了 schema.py 和 validationScript.py。我试图放置密钥规则,但似乎无法在该级别进行“任何”验证。在我的测试中,键规则似乎适用于字典中的所有键。如果我使用密钥规则,我可以验证一个密钥,但其他密钥失败。我尝试了一系列规则,我尝试了 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 时会出现语法错误:File "", line 5 'anyof': ^ SyntaxError: invalid syntax
使用键规则时,我最终会出现架构错误
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']}