Générer une dynamique de imbriquée objet JSON et de la matrice de python
Que la question explique le problème, j'ai essayé de générer imbriquée objet JSON. Dans ce cas, j'ai for
boucles d'obtenir les données de dictionnaire dic
. Ci-dessous le code:
f = open("test_json.txt", 'w')
flag = False
temp = ""
start = "{\n\t\"filename\"" + " : \"" +initial_filename+"\",\n\t\"data\"" +" : " +" [\n"
end = "\n\t]" +"\n}"
f.write(start)
for i, (key,value) in enumerate(dic.iteritems()):
f.write("{\n\t\"keyword\":"+"\""+str(key)+"\""+",\n")
f.write("\"term_freq\":"+str(len(value))+",\n")
f.write("\"lists\":[\n\t")
for item in value:
f.write("{\n")
f.write("\t\t\"occurance\" :"+str(item)+"\n")
#Check last object
if value.index(item)+1 == len(value):
f.write("}\n"
f.write("]\n")
else:
f.write("},") # close occurrence object
# Check last item in dic
if i == len(dic)-1:
flag = True
if(flag):
f.write("}")
else:
f.write("},") #close lists object
flag = False
#check for flag
f.write("]") #close lists array
f.write("}")
Sortie attendue est:
{
"filename": "abc.pdf",
"data": [{
"keyword": "irritation",
"term_freq": 5,
"lists": [{
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 2
}]
}, {
"keyword": "bomber",
"lists": [{
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 2
}],
"term_freq": 5
}]
}
Mais actuellement, je suis sortie comme ci-dessous:
{
"filename": "abc.pdf",
"data": [{
"keyword": "irritation",
"term_freq": 5,
"lists": [{
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 2
},] // Here lies the problem "," before array(last element)
}, {
"keyword": "bomber",
"lists": [{
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 1
}, {
"occurance": 2
},], // Here lies the problem "," before array(last element)
"term_freq": 5
}]
}
S'il vous plaît aider, j'ai essayer de le résoudre, mais a échoué. Merci de ne pas marquer en double, puisque j'ai déjà vérifié les autres réponses et n'aide pas du tout.
Edit 1:
L'entrée est essentiellement prises à partir d'un dictionnaire dic
dont le type de projection est <String, List>
par exemple: "l'irritation" => [1,3,5,7,8]
d'où l'irritation est la clé, et associée à une liste de numéros de page.
C'est essentiellement la lecture à l'extérieur pour la boucle où la clé est le mot clé et la valeur est une liste de pages d'occurrence de ce mot clé.
Edit 2:
dic = collections.defaultdict(list) # declaring the variable dictionary
dic[key].append(value) # inserting the values - useless to tell here
for key in dic:
# Here dic[x] represents list - each value of x
print key,":",dic[x],"\n" #prints the data in dictionary
json
fichier, vous pouvez utiliser le json
module plutôt que de les importer en tant que texte. Pouvez-vous donner des détails de votre fichier d'entrée?l'entrée est un processus long, je vais modifier la réponse de l'abstraction de l'entrée
Pourquoi ne pas utiliser json.vidage et ensuite mettre à jour l'objet JSON en plus de données arrive?
Eh bien, il est simple et agréable, bibliothèque appelée
json
(pip install pas nécessaire ), utilisez import json; print json.dumps(dic)
et le froidà l'aide de la bibliothèque, comment permet-il de résoudre le problème, pourriez-vous s'il vous plaît partager un extrait de code? @ZdaR
OriginalL'auteur Asif Ali | 2017-02-13
Vous devez vous connecter pour publier un commentaire.
Ce que @andrea-f semble bon pour moi, voici une autre solution:
N'hésitez pas à prendre dans les deux 🙂
C'est la même idée, j'ai d'abord créer un grand
json_dict
être enregistrées directement en json. J'utilise leavec
déclaration pour enregistrer le json en évitant les prises deexception
Aussi, vous devriez jeter un oeil à la doc de
json.décharges()
si vous avez besoin d'avenir s'améliorer dans votrejson
de sortie.MODIFIER
Et juste pour le fun, si vous n'aimez pas
tmp
var, vous pouvez faire toutes les donnéesfor
boucle dans un one-liner 🙂Il pourrait donné pour la solution finale de quelque chose de pas totalement lisible comme ceci:
EDIT 2
Il semble que vous ne souhaitez pas enregistrer votre
json
que la sortie souhaitée, mais être en mesure d' lire.En fait, vous pouvez également utiliser
json.dumps()
pour impression votre json.Il y a encore un problème ici,
"filename":
est imprimée à la fin de la liste parce que lad
dedata
vient avant lef
.À force de l'ordre, vous devrez utiliser un
OrderedDict
dans la génération de la dict. Attention la syntaxe est moche (omi) avecpython 2.X
Ici est la nouvelle solution complète 😉
Sera de sortie:
Mais attention, la plupart du temps, il est préférable d'enregistrer un régulière
.json
fichier afin d'être croisée des langues.Max, désolé de venir si tard à cette question, mais pouvez-vous s'il vous plaît m'aider avec une question que j'ai, qui est basé sur les mêmes lignes,stackoverflow.com/questions/53731125/...
OriginalL'auteur Owl Max
Votre code ne fonctionne pas parce que la boucle parcourt l'avant-dernier élément de l'ajout de la
},
puis, quand la boucle est exécuté à nouveau, il définit l'indicateur de faux, mais la dernière fois qu'il a couru, il a ajouté un,
car il pensait qu'il y aura un autre élément.Si c'est votre dict:
a = {"bomber":[1,2,3,4,5]}
alors vous pouvez faire:Puis enregistrez les données par:
pouvez-vous vérifier la mise à jour de réponse?
Pouvez-vous s'il vous plaît re-formater, de la façon illustrée dans attendu. Je l'ai essayé, finissent par obtenir diverses erreurs. Il sera utile et je vais accepter la réponse, merci pour les efforts
comment est-il maintenant?
Votre code est bon, mais je pense que l'idée originale de @AsifAli à utiliser
enumarate
dans lefor
boucle plutôt que dei = 0; i++
est plus pythonic (omi). Aussi, s'il vous plaît regardez dans ma réponse au cas d'utilisation de lawith
déclaration.OriginalL'auteur andrea-f