12
votes

JSON KeyError avec Json.loads

JSON semble être hoquet sur les affirmations suivantes:

text = temp['text']
KeyError: 'text'


0 commentaires

10 Réponses :


1
votes

Pourquoi ne pas mettre cela entre les première et seconde lignes: xxx


0 commentaires

9
votes

On dirait que cela se produit parce que le «texte» n'est pas là. Peut-être que vous pourriez utiliser quelque chose comme xxx

pour vérifier que "le texte" existe avant d'essayer de l'utiliser.

EDIT:

J'ai pris l'exemple donné dans le commentaire et ajouté un bloc IF / elif / sinife. xxx

échantillon de l'échantillon # 1: < BlockQuote>

{U'Favorited ': Faux, U'Contributs': Aucun, U'onté ': False, U'Text': ----- Snip ----}

échantillon chunk # 2:

{u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001l}}}


3 commentaires

Je pensais que c'était le problème et j'ai jubnuré le code ci-dessous: #! / usr / bin / python import SYS Import JSON F = OPEN (SYS.ARGV [1]) Pour la ligne en F: JSE.LOWLOADS (ligne) Essayez: 'Text' in j Print "Texte:", J Sauf: Imprimer "Exception:", J continue et obtenez les résultats suivants (seulement deux échantillons de morceaux) ... Texte: {u'favority ': faux, u'contributeurs': aucun, u'ontéd ': faux, u'ext' : ---- Snip ----} Texte: {U'Delete ': {U'Status': {U'USER_ID ': 55389449, U'ID': 12600579001L}}}


J'ai ajouté une version modifiée de votre code à ma réponse. Est-ce que cela fonctionne pour votre dossier?


Cela m'a passé devant le premier obstacle. Merci!



2
votes

de l'extrait que vous avez posté, il ressemble à TEMP ne doit avoir qu'un seul élément, avec la touche "Supprimer" . Vous n'avez pas de clé 'text' ', donc je ne suis donc pas sûr de ce que Temp ["texte'] devrait rechercher.


0 commentaires

8
votes

est-ce parce qu'il n'y a pas de clé "texte" dans la ligne ou parce que "Supprimer" n'est pas dans le dictionnaire? P>

C'est parce qu'il n'y a pas de "texte". Si vous Imprimer TEMP CODE> ou Vérifiez si la touche 'Text' code> est dans le dictionnaire Python résultant, vous remarquerez qu'il n'y a pas de clé nommée "texte" . En fait, TEMP code> a une seule touche: 'Supprimer' code>. Le dictionnaire qui est référencé par 'Supprimer' code> contient une touche unique 'Status' code> contenant un autre dictionnaire avec deux touches: 'user_id' code> et 'ID' code>. P>

En d'autres termes, votre structure est la suivante: p> xxx pré>

comme vous pouvez le voir, il n'y a pas " Texte "clé n'importe où. p>

En outre, vous pouvez le vérifier vous-même: P>

>>> 'text' in temp
False
>>> 'delete' in temp
True


0 commentaires

0
votes

Merci à tous pour les suggestions. Le cœur du problème était que le format Twitter JSON a un dictionnaire dans un dictionnaire. La solution implique un double index pour obtenir aux variables que j'ai besoin de vérifier.


0 commentaires

1
votes

Essayez-le comme ceci:

    temp = json.load(line)
    for lines in temp
       text = lines['text']


0 commentaires

2
votes

Essayez ceci pour voir le problème en détail: xxx

qui génère cette sortie: xxx

la seule touche du Temp dict est 'Supprimer'. Ainsi, temp ["texte '] génère un keerror.


0 commentaires

0
votes
#!/usr/bin/env python
import sys
import json
from pprint import pprint


json_file=sys.argv[1]
json_data=open(json_file)
j = json.load(json_data)

def main():
  for attribute_key in j['root_attribute']:
   try: print attribute_key['name'], attribute_key['status'], attribute_key['text']
   except KeyError: pass

if __name__ == "__main__":
    main()

0 commentaires


0
votes

Juste une version mise à jour de la réponse vérifiée.

Si la fréquence de cette erreur se produisait (ce qui signifie que la variable texte code> n'existe pas dans le fichier JSON) est inférieure à 50% alors que la voie Pour aller, c'est avec la réponse souhaitée. p>

mais si l'exception est vraiment exceptionnelle, vous devez utiliser P>

try:
   #your code here
except KeyError:
   continue


0 commentaires