Ayant des problèmes pour analyser une liste de dictionnaires, accéder à toutes les paires clé-valeur par dictionnaire, via une boucle afin de traiter chaque k-v à la fois.
J'ai un fichier json qui consiste en une liste de dictionnaires. Sous forme simplifiée:
Traceback (most recent call last):
File "somescript.py", line 26, in <module>
print(i, dat[i])
TypeError: list indices must be integers or slices, not dict
Je veux parcourir ce par dictionnaire, et pour chaque paire clé-valeur (à l'exclusion de la première, en supposant qu'elle sera ignorée car la clé est empty) par itération, ayant accès aux paires a, b, c kv d'un dict, afin qu'elles soient traitées individuellement.
J'ai essayé:
import json
with open("file.json", "r") as read_file:
data = json.load(read_file)
for i in data:
print(i, data[i])
Mais j'obtiens l'erreur suivante:
Traceback (most recent call last):
File "somescript.py", line 28, in <module>
for k, v in enumerate(result_list.items()):
AttributeError: 'list' object has no attribute 'items'
En attendant, j'ai essayé:
import json
with open("file.json", "r") as read_file:
data = json.load(read_file)
result_list = []
for d in data:
result_list.append([v for k,v in d.items()])
for k, v in enumerate(result_list.items()):
# process each key-value pair
Et obtenez:
[
{"": "0", "a": "3893", "b": "2389", "c": "1209"},
{"": "1", "a": "4308", "b": "4560", "c": "9127"},
...
]
Le code est défectueux, je ne sais pas encore comment réaliser ce qui précède, c'est peut-être simple mais je ne l'ai pas encore trouvé.
3 Réponses :
La première partie de votre problème est dans votre appel d'énumération:
for item in data:
for key in item:
print(key, item[key])
Vous n'invoquez pas .items () sur la liste_résultats; enumerate le consomme sous forme de liste.
Pour répondre au deuxième de vos problèmes:
import json
with open("file.json", "r") as read_file:
data = json.load(read_file)
for i in data:
print(i, data[i])
En supposant que json est une liste de dictionnaires comme vous l'avez utilisé , vous devrez:
for k, v in enumerate(result_list): # take off the .items())
# process each key-value pair
pour tenir compte du double déréférencement.
Vous devriez pouvoir charger la liste entière sans la reconstruire simplement en utilisant json.load , puis itérer dessus et les dicts
with open("file.json", "r") as read_file:
data = json.load(read_file)
for _id, item in data.items():
for k, v in item.items():
print(_id, k, v)
Cela dit, je suggère vous enregistrez le fichier en tant que fichier JSON normal car il semble que la première clé / valeur de chaque dict est censée être un champ ID , il devrait donc ressembler à ceci:
with open("file.json", 'w') as out_file:
json.dump({d.pop(""): d for d in data}, out_file, indent=4)
D'après ce que je peux dire, l'entrée est un tableau d'objets JSON, pas un fichier avec un objet par ligne.
Oui, j'ai réalisé que, réparant
for d in data:
for k, v in d.items():
# process each key-value pair
Merci, cela a parfaitement fonctionné et c'est exactement ce que j'ai essayé de faire. Merci beaucoup!
Il existe plusieurs erreurs de syntaxe dans vos données et votre code. Veuillez publier le code que vous avez réellement testé.
Quoi qu'il en soit, en supposant des correctifs raisonnables à votre message,
result_listest une liste de listes contenant les valeurs de chaque dictionnaire. Une liste n'a pas de méthodeitems. Supprimez simplement.items ()si vous souhaitez l'itérer.Vos éléments 'c' dans le dictionnaire ne sont pas séparés par
:; avez-vous le code que vous utilisez?Merci! Oui, quelques erreurs, j'ai fait des corrections, mais les données et le code utilisés sont des copies presque exactes de l'original. Le code est 1 contre 1.
Alors, comprenez-vous ce que signifient les messages d'erreur? Parce qu'ils sont assez clairs si vous connaissez du vocabulaire python. Sinon, qu'est-ce que vous ne comprenez pas?
"Je veux parcourir ceci par dictionnaire, et pour chaque paire clé-valeur" Cela suggère que vous avez besoin d'une boucle imbriquée.
Merci. Aussi à Blorgbeard. Je comprends la plupart des termes, mais pas toutes leurs implications.