web-dev-qa-db-fra.com

Python: touches dict par défaut pour éviter KeyError

Assez nouveau pour python, développeur novice, premier appelant

J'appelle du JSON et analyse les données pertinentes en tant que csv. Je ne peux pas comprendre comment remplir le fichier json Dict intermédiaire avec des clés par défaut, car beaucoup ne sont pas peuplés. Le résultat est une erreur de clé lorsque j'essaie d'analyser le contenu dans un fichier csv. J'adorerais tout conseil!

Merci.

Mise à jour: merci à tous! Je reçois maintenant une erreur "NoneType" pour (fabricant):

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
26
Kenfucious

Vous pouvez utiliser your_dict.get(key, "default value") au lieu de référencer directement une clé.

60
Stack of Pancakes

N'utilisez pas le nom d'argument "par défaut". Par exemple, si nous voulons 1.0 comme valeur par défaut,

rank = dict.get(key, 1.0)

Pour plus de détails: TypeError: get () ne prend aucun argument de mot clé

8
Serendipity

Si vous ne pouvez pas définir de valeur par défaut et que vous souhaitez faire autre chose (ou simplement omettre l'entrée):

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

Vous pouvez utiliser une syntaxe comme celle-ci: product.get("your field", "default value")

2
Eugen