Python: par défaut dict clés pour éviter de KeyError
Assez python, novice développeur, pour la première fois de l'appelant
Je vais appeler quelques JSON et l'analyse pertinente des données au format csv. Je ne peux pas comprendre comment remplir l'intermédiaire json Dict fichier avec les touches par défaut, car beaucoup sont inhabitées. Le résultat est un KeyError que je tente d'analyser le contenu dans un fichier csv. Aimerais des conseils!
Grâce.
Mise à jour: merci à tous! Je suis maintenant à la réception d'un 'NoneType' erreur (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
OriginalL'auteur Kenfucious | 2014-07-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
your_dict.get(key, "default value")
au lieu de directement de la référence d'une clé.la valeur par défaut est None
Chaque fois que vous auriez normalement accéder à une clé. Donc, quand vous allez à obtenir le nom du produit au lieu de
row.append(product['name'])
vous utilisezrow.append(product.get('name', 'value if name key doesn't exist'))
Merci, cela semble fonctionner!! Un dernier point: je suis maintenant un nonetype d'erreur pour l'un des champs (fabricant). Si la clause de " nom " fonctionne bien, mais une syntaxe similaire rendements de la redoutable KeyError une fois de plus.
N'utilisez pas de
None
pour la valeur par défaut. Dans votre code, vous êtes un réglage à""
si la valeur n'existe pas. Donc, essayezrow.append(product.get('name', ''))
Qui va ajouter de la valeur pourname
si elle existe, ou une chaîne vide s'il ne le fait pas.OriginalL'auteur Stack of Pancakes
N'utilisez pas le "par défaut" nom d'argument. Par exemple, si nous voulons 1.0 comme valeur par défaut,
Pour plus de détails:
TypeError: get() ne prend pas d'arguments mot-clé
OriginalL'auteur Serendipity
Si vous ne pouvez pas définir une valeur par défaut et que vous voulez faire quelque chose d'autre (ou tout simplement omettre l'entrée):
OriginalL'auteur Alceu Rodrigues de Freitas Jun
Vous pouvez utiliser une syntaxe comme ceci:
product.get("your field", "default value")
OriginalL'auteur Eugen