【问题标题】:parse yaml file to find duplicate values using python使用 python 解析 yaml 文件以查找重复值
【发布时间】:2020-09-14 05:40:48
【问题描述】:

我有以下 Yaml 文件

Tests:
 - Test:
    test_name: Test_Name1
    test_id: 1
    test_desc: Test Name1
 - Test:
    test_name: Test_Name2
    test_id: 2
    test_desc: Test Name2
 - Test:
    test_name: Test_Name1
    test_id: 3
    test_desc: Test Name3

如果任何 test_name 具有重复值,我必须发出警报。例如,在上述情况下,由于重复 Test_Name1,这将引发警报。 test_name 和 test_id 在文件中应该具有唯一值。 我尝试将 yaml 转换为字典,然后找出重复值,这显示错误为 TypeError: unhashable type: 'list'。

下面是我的代码

import yaml

mapping = {}
stream = open('C:/modelsData/work/tests.yaml', 'r')
data = yaml.load(stream)
for key in data:
    mapping.setdefault(data[key], set()).add(key)
print(mapping)
result = filter(lambda x: len(x)>1, mapping.values())
print("Duplicated Values ", list(result))

请注意 - 我无法从 yaml 文件中删除“-”。基本上我无法更改文件中的任何内容,这是通过代码完成的。 :)

【问题讨论】:

  • for key in data: 迭代单个值,"Tests"data[key] 是一个列表。您不需要更改 YAML 结构,但您需要知道它解析为什么。
  • for key in data: mapping[key] = [] mapping[key].extend(data[key]) -- 也没有按预期工作
  • @jonrsharpe for key, value in data.items(): mapping.setdefault(value, set()).add(key) - 这也没有用
  • 我强烈建议您进行基本调试 - 也许添加 prints 以查看您实际使用的内容。如果您不熟悉 YAML 语法,请确保您了解该数据的实际形状。
  • 您是要删除重复项还是只显示一条消息,哪个是重复项。添加预期输出

标签: python parsing yaml


【解决方案1】:

打印转换的结果并使用它,尝试一步一步得到结果。我就是这么想的:

import yaml

stream = open('save_text.txt', 'r')
data = yaml.load(stream, Loader=yaml.FullLoader)

t_list = data["Tests"]

spot_duplicates = {}
for test in t_list:

    if test["Test"]["test_name"] not in spot_duplicates:
        spot_duplicates[test["Test"]["test_name"]] = 1
    else:
        spot_duplicates[test["Test"]["test_name"]] += 1

for dup in spot_duplicates:
    if spot_duplicates[dup] > 1:
        print("Duplicated value", dup)

【讨论】:

    猜你喜欢
    • 2020-10-14
    • 2020-07-18
    • 1970-01-01
    • 2019-06-27
    • 2018-02-16
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 2020-12-09
    相关资源
    最近更新 更多