python - 读取一个json文件和编码问题

标签 python json python-2.7

我想解析一个 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”(strunicode 的实例), 期望 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/

相关文章:

python - 使用 Django 在 Html 表中交替行颜色

python - 使用 Apache 代理对 Tornado 的请求 - 502 错误

javascript - 使用 Angular 按当前日期过滤 JSON 数据

json - Wordpress REST API 搜索产品

javascript - 什么是 Node JS 的最佳 JSON 或 JS 对象到 XML 转换器模块

python - 安装一半的包和python循环依赖

Apache VirtualHost 后面带有 WSGI 的 Django 给出 404

python - 具有特定比例的二进制随机数组?

python - matplotlib 文本下划线

python - 使用列表创建字典