避免 KeyError 的默认字典键

Posted

技术标签:

【中文标题】避免 KeyError 的默认字典键【英文标题】:Default dict keys to avoid KeyError 【发布时间】:2014-09-08 22:38:50 【问题描述】:

我正在调用一些 JSON 并将相关数据解析为 CSV。我无法弄清楚如何使用默认键填充中间 JSON dict 文件,因为许多未填充。结果是 KeyError,因为我尝试将内容解析为 CSV。

我现在收到(制造商)的“NoneType”错误:

import urllib2, json, csv, sys, os, codecs, re

from collections import defaultdict

output = 'bb.csv'

csv_writer = csv.writer(open(output, 'w'))

header = ['sku', 'name', 'description', 'image', 'manufacturer', 'upc', 'department', 'class', 'subclass']

csv_writer.writerow(header)

i=1

while i<101:
    print i

    bb_url = urllib2.Request("http://api.remix.bestbuy.com/v1/products(sku=*)?show=sku,name,description,image,manufacturer,upc,department,class,subclass&format=json&sort=sku.asc&page=" + str(i) + "&pageSize=100&apiKey=*****************")
    bb_json = json.load(urllib2.urlopen(bb_url))

    print bb_json

    for product in bb_json['products']:
        row = []

        row.append(product['sku'])
        if product['name']:
            row.append(str((product['name']).encode('utf-8')))
        else:
            row.append("")
        row.append(str(product.get('description',"")))
        row.append(str(product['image'])+ " ")
        if product['name']:
            row.append(str(product.get('manufacturer',"").encode('utf-8')))
        else:
            row.append("")
        row.append(str(product.get('upc','').encode('utf-8')))
        row.append(str((product['department']).encode('utf-8')))
        row.append(str((product['class']).encode('utf-8')))
        row.append(str((product['subclass']).encode('utf-8')))

        csv_writer.writerow(row)

    i = i+1

【问题讨论】:

【参考方案1】:

您可以使用your_dict.get(key, "default value") 而不是直接引用密钥。

【讨论】:

感谢您的协助。该行将插入到 for 循环之前,还是在循环内迭代? 当您通常访问密钥时。因此,当您获取产品名称而不是 row.append(product['name']) 时,您将使用 row.append(product.get('name', 'value if name key doesn't exist')) 谢谢,这似乎有效!最后一点:我现在收到一个字段(制造商)的非类型错误。 'name' 的 if 子句运行良好,但类似的语法再次产生可怕的 KeyError。 不要使用None 作为默认值。如果值不存在,则在您的代码中将其设置为 ""。所以试试row.append(product.get('name', '')),如果它存在,它将附加name的值,如果不存在,则附加一个空字符串。 请注意,“dict”不应该是字典的名称,因为“dict”是 Python 中保留的内置符号【参考方案2】:

不要使用“默认”参数名称。例如,如果我们希望 1.0 作为默认值,

rank = dict.get(key, 1.0)

更多详情: TypeError: get() takes no keyword arguments

【讨论】:

【参考方案3】:

如果您无法定义默认值并想做其他事情(或只是省略该条目):

if key in dict:
    rank = dict[key]
else:
    # do something or just skip the else block entirely

【讨论】:

【参考方案4】:

您可以使用如下语法:product.get("your field", "default value")

【讨论】:

以上是关于避免 KeyError 的默认字典键的主要内容,如果未能解决你的问题,请参考以下文章

python字典日期时间作为键,keyError

python里出现keyerror 怎么解决

尝试向 Python 字典添加新键时出现 keyerror python

关于字典dict“相加减”以及KeyError处理

在Python中出现了KeyError: ''怎么解决?

我的代码中的 keyerror 1