2017-10-19 6 views
0

J'ai donc un fichier json dont j'ai besoin pour obtenir deux chaînes différentes pour différents fichiers. Le premier est d'aller au fichier comme il se doit, mais le second ne l'est pas.Itération du même fichier json (dict) deux fois dans la boucle

J'ai fait mes recherches et je sais que j'ai besoin de déplacer le pointeur de fichier pour commencer. Mais je ne sais pas comment le faire. Parce que je vais obtenir cette erreur:

Traceback (most recent call last): 
    File "v4.py", line 65, in <module> 
    data.seek(0,0) 
AttributeError: 'str' object has no attribute 'seek' 

en essayant de le déplacer en arrière avec .seek(0)

with open('idd.json', 'r') as data_file:  
    data = json.load(data_file) 

with open('id.txt','w') as outfile: 
    for data, lokaatio in data[0].items(): 
     if data=='id': 
      print(lokaatio, file=outfile) 

data.seek(0,0) 

with open('type.txt','w') as outfiles: 
    for data, type in data[0].items(): 
     if data=='fileType': 
      print(type, file=outfiles) 

Comment déplacer le fichier vous JSON (dict) pour lancer une nouvelle recherche pour ..


Mise à jour:

maintenant, il n'y a pas d'erreur, mais le second fichier reste vide. (Merci pour les lignes de code raccourcies!)

Le type de fichier n'est pas trouvé par le python. Est-ce que la seule solution restante est que quelque chose ne va pas dans mon fichier? Il semble peu près comme ceci:

[{'id': 'BDB-0bxGag9AL_C4xB0hlM', 'versionNumber': 1}, { 'widthMm': 127,0, 'heightIn': 5.0, 'width': 1500} , { 'documentid': 'xmp.483a0ab5', 'filetype': 'JPEG', 'heightMm': 127,0}, 'autorisations': 'rx--'}]

+0

Le problème est avec 'pour data, lokaatio in ...': vous réutilisez le nom de la variable de données pour que l'ancien soit écrasé. Il contenait à l'origine un dictionnaire, pas besoin de chercher (0). – RemcoGerlich

+0

'data' n'est pas un objet fichier. Vous avez simplement réutilisé le nom dans la boucle 'for' pour le lier à une chaîne. –

+0

Pourriez-vous ajouter 'print (data)' après 'data' chargé à partir du fichier et afficher les résultats? – kvorobiev

Répondre

0

Après la ligne

data = json.load(data_file) 

La variable data contiendra dict, et non file. Et votre code (sauf data.seek(0,0) qui est faux) est presque parfait. Votre problème était à

for data, lokaatio in data[0].items(): 

vous redéfinissez la variable data. Essayez de le remplacer par

with open('id.txt','w') as outfile: 
    for d, lokaatio in data[0].items(): 
     if d=='id': 
      print(lokaatio, file=outfile) 

En outre, une boucle sur dict est inutile (grâce au commentaire de @ Jean-François Fabre). Vous pourriez juste obtenir un élément par clé.

with open('id.txt','w') as outfile: 
    print(data.get('id', ''), file=outfile) 

même pour la deuxième boucle

with open('type.txt','w') as outfiles: 
    print(data.get('fileType', ''), file=outfiles) 

Tout votre code pourrait être remplacé par

with open('idd.json', 'r') as data_file:  
    data = json.load(data_file) 

with open('id.txt','w') as idfile, open('type.txt','w') as typefile: 
    print(data.get('id', ''), file=idfile) 
    print(data.get('fileType', ''), file=typefile) 
+1

pourquoi boucler sur le Dicter des éléments pour rechercher la clé? cela semble lidicrious. pas besoin d'une boucle. –

+0

@ Jean-François Fabre D'accord, merci pour le commentaire. Mettra à jour la réponse – kvorobiev

+0

@ E.W Voir mes mises à jour. Et ajouter une nouvelle description du problème à votre question. – kvorobiev

0

Il est deux fois pas besoin de boucle, il suffit d'utiliser un simple si, déclaration Elif et ouverte vos deux fichiers ensemble. Comme ceci:

with open('idd.json', 'r') as data_file:  
    data = json.load(data_file) 

with open('id.txt','w') as outfile1, open('type.txt','w') as outfile2 : 
    for key,value in data[0].items(): # or is your dict in data.items()? 
     if key =='id': 
      print(value, file=outfile1) 
     elif key =='fileType': 
      print(value, file=outfile2)