【问题标题】:listing YAML Nodes列出 YAML 节点
【发布时间】:2015-12-13 14:06:39
【问题描述】:

我对 YAML 和 Python 都很陌生。我正在尝试列出我的 YAML 文件中的所有键和值。但想不出办法。感谢帮助。

YAML 文件

---
    Task_T0:
      -
       args:
            task_path: "..."
       executor:
            type: "T0"

    Task_T1:
      -
       args:
           task_path: "~/task_file"
       executor:
           type: "T1"
       data:
         params:
            p1: 0

我想列出所有节点(Task_T...)。 这是我尝试过的,因为我找不到任何 API 这样做:

 parsed_task = yaml.safe_load(rendered_task)
 for task_obj in enumerate(parsed_task):
     path = task_obj[0]["args"]["task_path"]
     print("task path::" + path)

我收到此错误:

'int' object has no attribute '__getitem__'

如果我将代码修改为:

parsed_task = yaml.safe_load(rendered_task)
for task_obj in enumerate(parsed_task):
     path = task_obj["args"]["task_path"]
     print("task path::" + path)

然后我收到此错误:

tuple indices must be integers, not str

【问题讨论】:

  • 您至少可以发布一些代码,向我们展示您的尝试吗?如果您真的无法完全理解 pyyaml,请参阅:PyYAML doc
  • 添加了我尝试过的代码。请不要责怪我糟糕的 python 编码。
  • 没关系,你是来学习的。没有人在这里责怪人们。可以请您发布所有代码吗? rendered_task 不存在。通过发布一个可运行的示例,尝试使其更易于使用以提供帮助。
  • python 代码无效,您必须缩进for ....: 后面的行。如果你想要所有的键和值,你必须创建一个函数,如果它们是序列或映射,则递归调用自身的值,因为它们可以包含更多的键值对。
  • 您使用的单个 - 被 YAML 解释为 sequence 元素。要么删除它(这样你的代码就可以工作了),要么使用task_obj[0]["args"]["task_path"] 来访问相应的字段。

标签: python yaml pyyaml


【解决方案1】:

终于用下面的代码让它工作了:

parsed_task = yaml.safe_load(task_file)
for task_obj in enumerate(parsed_task):
    name = task_obj[1]
    print("task name:" + name)

上面的代码打印任务的名称。 如果您想了解每个任务的更多详细信息,那么

parsed_task = yaml.safe_load(rendered_task)
for scenario_obj in enumerate(parsed_task):
    name = scenario_obj[1]
    print("scenario name:" + name)
    print(parsed_task[name][0]["args"]["task_path"])

以上代码将打印每个节点的任务路径。

【讨论】:

  • 实际上,enumerate(parsed_task) 返回 元组 (index, value) 的列表。这就是为什么您需要额外的索引[1]。如果您只需要这些值,请改用values(parsed_task)
  • 是的,你完全正确。感谢您提供获取值的提示。
猜你喜欢
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多