【发布时间】:2018-02-16 13:26:47
【问题描述】:
我有一个 YAML 文件,如下所示:
categories:
- Exp:
topics:
- Experience:
keywords:
- refresh
- tapping
- Availability:
keywords:
- fish
- get work
- Wp:
topics:
- Waits:
keywords:
- wait
- long line
- Process:
keywords:
- check in
- check-in
我想知道是否有更好/更简单的方法来解析 python 中的 yaml 文件。我基本上想在 yaml 文件中的字符串中搜索 topics 中的关键字,如果该主题的一个关键字存在,则打印该主题的名称以及 category's 名称。并为每个主题执行此操作。从上面的yaml文件示例来看,分类为Exp和Wp,其下的主题分别为Experience和Availability&Waits和Process。
我要测试的字符串是:
s = "Refresh after tapping takes long wait. Can't get work"
所以输出应该是:
topic: Experience
topic: Availability
category: Exp
topic: Waits
category: Wp
我正在尝试按如下方式解析 yaml:
import yaml
with open("file.yaml", 'r') as stream:
try:
yml = yaml.load(stream)
except yaml.YAMLError as exc:
print(exc)
for key, val in yml.items():
for i in val:
for k, v in i.items():
for k1, v1 in v.items():
if k1 == 'topics':
for j in v1:
for k2, v2 in j.items():
for k3, v3 in v2.items():
if k3 == 'keywords':
print v3
但是,正如您所看到的,有很多 for 循环可以到达主题关键字,这是一段非常糟糕的代码。如何以更好的方式做到这一点?
【问题讨论】:
-
yaml.load()返回时,您已经解析了 YAML 文档。到目前为止,这是代码中最糟糕的部分,而不是 for 循环。如果您无法控制输入,则使用yaml.load()是不安全的。您很少需要不安全的解析,当然不是您的,并且使用它可能会丢失您的光盘内容或更糟。
标签: python string dictionary yaml string-matching