JSON semble être hoquet sur les affirmations suivantes:
text = temp['text'] KeyError: 'text'
10 Réponses :
Pourquoi ne pas mettre cela entre les première et seconde lignes:
On dirait que cela se produit parce que le «texte» n'est pas là. Peut-être que vous pourriez utiliser quelque chose comme pour vérifier que "le texte" existe avant d'essayer de l'utiliser. P> EDIT: STROF> P> J'ai pris l'exemple donné dans le commentaire et ajouté un bloc IF / elif / sinife. P> échantillon de l'échantillon # 1: p> < BlockQuote>
{U'Favorited ': Faux, U'Contributs': Aucun, U'onté ': False, U'Text': ----- Snip ----} P>
blockQuote> échantillon chunk # 2: p> {u'delete ': {u'status': {u'user_id ': 55389449, u'id': 12600579001l}}} P>
blockQuote> p>
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!
de l'extrait que vous avez posté, il ressemble à TEMP code> ne doit avoir qu'un seul élément, avec la touche "Supprimer" code>. Vous n'avez pas de clé 'text' ' code>, donc je ne suis donc pas sûr de ce que Temp ["texte'] code> devrait rechercher. P>
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
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. p>
Essayez-le comme ceci:
temp = json.load(line)
for lines in temp
text = lines['text']
Essayez ceci pour voir le problème en détail: qui génère cette sortie: p> la seule touche du Temp code> dict est 'Supprimer'. Ainsi, temp ["texte '] code> génère un keerror. P> p>
#!/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()
Cela a résolu ma question. Notez que dans certaines situations renvoyant NULL ("Aucun" en Python) sera un problème pour un traitement ultérieur, vous pouvez donc modifier la valeur de la valeur si la clé est manquante à l'aide de temp.get ("Texte") où x est une chaîne
@Lobi N'hésitez pas à éditer la réponse pour ajouter cette information et obtenir deux points de réputation;)
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 mais si l'exception est vraiment exceptionnelle, vous devez utiliser P> 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> try:
#your code here
except KeyError:
continue