在 Python 中解析 Yaml:检测重复键
Parsing Yaml in Python: Detect duplicated keys
python 中的 yaml
库无法检测重复键。这是一个 has been reported years ago 的错误,目前还没有修复。
我想找到解决此问题的合适方法。创建一个 returns 所有键的 regex
有多合理?那么就很容易检测到这个问题。
任何正则表达式大师都可以推荐一个能够提取所有键以查找重复项的正则表达式吗?
文件示例:
mykey1:
subkey1: value1
subkey2: value2
subkey3:
- value 3.1
- value 3.2
mykey2:
subkey1: this is not duplicated
subkey5: value5
subkey5: duplicated!
subkey6:
subkey6.1: value6.1
subkey6.2: valye6.2
yamllint 命令行工具可以满足您的需求
想要:
sudo pip install yamllint
具体来说,它有一个检测重复和键的规则key-duplicates
互相覆盖:
$ yamllint test.yaml
test.yaml
1:1 warning missing document start "---" (document-start)
10:5 error duplication of key "subkey5" in mapping (key-duplicates)
(它还有许多您可以 enable/disable 或调整的其他规则。)
重载内置加载程序是一种更轻量级的方法:
import yaml
# special loader with duplicate key checking
class UniqueKeyLoader(yaml.SafeLoader):
def construct_mapping(self, node, deep=False):
mapping = []
for key_node, value_node in node.value:
key = self.construct_object(key_node, deep=deep)
assert key not in mapping
mapping.append(key)
return super().construct_mapping(node, deep)
然后:
yaml_text = open(filename), 'r').read()
data[f] = yaml.load(yaml_text, Loader=UniqueKeyLoader)
python 中的 yaml
库无法检测重复键。这是一个 has been reported years ago 的错误,目前还没有修复。
我想找到解决此问题的合适方法。创建一个 returns 所有键的 regex
有多合理?那么就很容易检测到这个问题。
任何正则表达式大师都可以推荐一个能够提取所有键以查找重复项的正则表达式吗?
文件示例:
mykey1:
subkey1: value1
subkey2: value2
subkey3:
- value 3.1
- value 3.2
mykey2:
subkey1: this is not duplicated
subkey5: value5
subkey5: duplicated!
subkey6:
subkey6.1: value6.1
subkey6.2: valye6.2
yamllint 命令行工具可以满足您的需求 想要:
sudo pip install yamllint
具体来说,它有一个检测重复和键的规则key-duplicates
互相覆盖:
$ yamllint test.yaml
test.yaml
1:1 warning missing document start "---" (document-start)
10:5 error duplication of key "subkey5" in mapping (key-duplicates)
(它还有许多您可以 enable/disable 或调整的其他规则。)
重载内置加载程序是一种更轻量级的方法:
import yaml
# special loader with duplicate key checking
class UniqueKeyLoader(yaml.SafeLoader):
def construct_mapping(self, node, deep=False):
mapping = []
for key_node, value_node in node.value:
key = self.construct_object(key_node, deep=deep)
assert key not in mapping
mapping.append(key)
return super().construct_mapping(node, deep)
然后:
yaml_text = open(filename), 'r').read()
data[f] = yaml.load(yaml_text, Loader=UniqueKeyLoader)