【问题标题】:Default dict keys to avoid KeyError避免 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

【问题讨论】:

    标签: python json csv dictionary keyerror


    【解决方案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")

        【讨论】:

          猜你喜欢
          • 2021-01-28
          • 1970-01-01
          • 2018-02-11
          • 2017-10-19
          • 2021-02-03
          • 2011-06-29
          • 1970-01-01
          • 1970-01-01
          • 2016-01-28
          相关资源
          最近更新 更多