我想解析一个 JSON 文件并在这段代码中打印 source
:
{
"trailers": {
"quicktime": [],
"youtube": [
{
"source": "mmNhzU6ySL8",
"type": "Trailer",
"name": "Trailer 1",
"size": "HD"
},
{
"source": "CPTIgILtna8",
"type": "Trailer",
"name": "Trailer 2",
"size": "Standard"
}
],
"id": 27205
},
我写了这段代码:
for item in j:
if item['trailers']:
e = item['trailers']
for k,value in e.iteritems():
if k == "youtube":
for innerk, innerv in k.iteritems():
if innerk == "source" :
print innerv
不幸的是我无法解决这个错误:
for innerk, innerv in k.iteritems():
AttributeError: 'unicode' object has no attribute 'iteritems'
最佳答案
假设 JSON 格式正确,问题是您的代码包含此检查:
if k == "youtube":
for innerk, innerv in k.iteritems():
鉴于您刚刚要求 k
成为 “youtube”
(str
或 unicode
的实例), 期望 k
有一个 iteritems
方法是没有意义的。
我相信您期待的是与 k
一起出现的关联 dict
,如下所示:
if k == "youtube":
for innerk, innerv in value.iteritems():
不过,我从您的 JSON 中注意到,您应该期望多个 dict
变量被加载为 list
类型的值,用于以下情况k == "youtube"
。在这种情况下,您需要先遍历这些元素,分别询问每个元素的 iteritems
:
if k == "youtube":
for each_dict in value:
for innerk, innerv in each_dict.iteritems():
或类似的东西。最终的完整代码将是:
for item in j:
if item['trailers']:
e = item['trailers']
for k,value in e.iteritems():
if k == "youtube":
for each_dict in value:
for innerk, innerv in each_dict.iteritems():
if innerk == "source" :
print innerv
除了一阶问题,您还应该看一下 dict
类型的内置方法 get
,它允许您安全地从字典并在它们丢失时优雅地处理这种情况。在您的代码中,当您说 if item['trailers']:
时,这可能不会按您预期的方式运行。
首先,如果 trailers
不是字典的键,它将生成一个 KeyError
而不是跳过那个条件 block 。其次,如果为键值 trailers
存储的值在 bool
上下文中计算为 False
,则条件 block 也将被跳过,即使你曾想以不同的方式处理它(例如,假设 None
是一个标记值,表示在这种情况下没有用于 trailers
的数据,但这是由于特定的您要记录的错误。
与此同时,如果它只是一个空的 dict
那么这意味着您应该简单地跳过条件 block )。这在一次性数据探索中可能无关紧要,但一般来说,自动调节以避免此类陷阱是件好事,尤其是当内置类型本身可以很容易地更优雅地处理事情时。
考虑到所有这些,更 Pythonic 的方法可能如下:
for item in j:
y_tube = item.get('trailers', {}).get("youtube", [])
for each_dict in y_tube:
print each_dict.get("source", "Warning: no entry found for 'source'")
关于python - 读取一个json文件和编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20643728/