方法返回一个dict,检查是否存在键返回KeyError:0

时间:2016-01-10 20:53:25

标签: python python-3.x dictionary

我正在尝试通过投入自己并试图完成工作来学习Python。我在基本的东西上遇到了麻烦。我可以帮忙吗?

我正在使用os.walk查找我的(Jekyll)markdown文件,通过python-frontmatter加载他们的frontmatter,并收集feature_image属性列表,这些属性可能在每个文件中,也可能不在。

根据图书馆的文档,前端可以作为字典访问,我的谷歌搜索说我应该可以使用

if "property" in dict:

构造以查看属性键是否在dict中定义,但是当我尝试时遇到“KeyError:0”错误。

这是我走了多远:

import os
import frontmatter

markdownExt = ("md", "markdown")
templateDir = "jekyll/_posts"

for root, dirs, files in os.walk(templateDir, topdown=False):
    for name in files:
        if name.endswith(markdownExt):
            post = frontmatter.load( os.path.join(root, name) )
            if "feature_image" in post:
                print(post["feature_image"])

这是我在运行此脚本时得到的内容

Traceback (most recent call last):
  File "./test.py", line 14, in <module>
    if "feature_image" in post:
  File "/usr/local/lib/python3.5/site-packages/frontmatter/__init__.py", line 124, in __getitem__
    return self.metadata[name]
KeyError: 0

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

使用简答:

if "feature_image" in post.keys(): #see the keys function?

更长的答案:

Post类没有提供__contain__方法,所以python尝试使用Post .__ getitem__使用迭代器协议迭代它然后你爆发了Key 0 Exception

有关更多信息,请尝试查看python如何迭代事物:)

答案 1 :(得分:1)

如果您不确定字典中的值是什么,那么最好的选择是使用dict.get("key", "default value"),如果默认情况下值不在字典中,则此方法将返回None。在布尔上下文None == False

在你的情况下,它将看起来像:

if post.get("feature_image"):
    # do smth