Erzeugt eine dynamische verschachtelte JSON-Objekt-und array - python
Als die Frage erklärt das problem, das ich versucht habe zu erzeugen verschachtelte JSON-Objekt. In diesem Fall habe ich for
loops abrufen der Daten aus dem Wörterbuch dic
. Unten ist der 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("}")
Erwartete Ausgabe ist:
{
"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
}]
}
Aber derzeit bin ich immer eine Ausgabe wie nachfolgend:
{
"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
}]
}
Bitte helfen, ich habe versucht, es zu lösen, scheiterte aber. Bitte nicht markieren, duplizieren, da habe ich bereits überprüft, andere Antworten und überhaupt keine Hilfe.
Edit 1:
Die Eingabe ist im Grunde genommen aus einem Wörterbuch dic
deren mapping-Typ ist <String, List>
zum Beispiel: "irritation" => [1,3,5,7,8]
wo der Reizung ist der Schlüssel, und die zugeordneten, um eine Liste von Seitenzahlen.
Dies ist im Grunde Lesen Sie in der äußeren for-Schleife, wo der Schlüssel ist das Schlüsselwort und Wert ist eine Liste von Seiten der vorkommen des Schlüsselworts.
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
Datei, die Sie verwenden könnten, die json
Modul, statt Sie zu importieren als text. Können Sie jedes detail Ihrer input-Datei?Eingang ist ein langer Prozess, ich werde Bearbeiten Sie die Antwort mit der Abstraktion von der die Eingabe
Warum nicht Sie json verwenden.dump und aktualisieren Sie dann das JSON-Objekt als mehr Daten ankommen?
Nun, es ist ein schönes, einfaches Bibliothek namens
json
(pip-Installation ist nicht erforderlich ), verwenden Sie import json; print json.dumps(dic)
und chillmit dieser Bibliothek, wie funktioniert es, das problem zu lösen, könnten Sie bitte teilen Sie ein code-snippet? @ZdaR
InformationsquelleAutor Asif Ali | 2017-02-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was @andrea-f, sieht gut aus für mich, hier eine andere Lösung:
Fühlen Sie sich frei zu wählen, in beiden 🙂
Es ist die gleiche Idee, habe ich zunächst eine große
json_dict
gespeichert werden direkt im json-Format. Ich benutze die- Anweisung zu speichern, die json-Vermeidung der Fang von
exception
Auch, sollten Sie einen Blick auf die doc
json.dumps()
wenn Sie müssen Zukunft verbessern in Ihremjson
Ausgabe.BEARBEITEN
Und nur so zum Spaß, wenn Sie nicht wie
tmp
var, die Sie tun können, alle Datenfor
Schleife in einem one-liner 🙂Könnte es gab für die endgültige Lösung etwas, das nicht völlig lesbar wie dieses:
EDIT 2
Es sieht aus wie Sie nicht möchten, speichern Sie Ihre
json
wie die gewünschte Ausgabe, aber werden abble zu Lesen.In der Tat, können Sie auch
json.dumps()
um drucken deine json.Es ist immer noch ein problem ist hier allerdings
"filename":
gedruckt am Ende der Liste, weil derd
vondata
kommt, bevor dief
.Zu zwingen, die Ordnung, die Sie verwenden,
OrderedDict
in der generation des dict. Vorsichtig sein, die syntax ist hässlich (imo) mitpython 2.X
Hier ist die neue Komplettlösung 😉
Ausgabe:
Aber Vorsicht, die meisten der Zeit, ist es besser zu sparen regelmäßige
.json
- Datei, um sein Kreuz Sprachen.Max, sorry, kommt so spät auf diese Frage, aber können Sie bitte helfen Sie mir mit einer Frage, die ich habe, die basiert auf ähnlichen Linien,stackoverflow.com/questions/53731125/...
InformationsquelleAutor Owl Max
Deinen aktuellen code nicht funktioniert, da die Schleife durchläuft das vor-Letzte Element hinzufügen die
},
dann, wenn die Schleife erneut ausgeführt, es wird das flag auf false, aber die Letzte Zeit lief es folgte ein,
da er dachte, dass es ein anderes element.Wenn das ist Ihre dict:
a = {"bomber":[1,2,3,4,5]}
dann können Sie tun:Dann speichern Sie die Daten durch:
können Sie prüfen, die aktualisierte Antwort?
Kannst du bitte re-formatieren Sie es in der gezeigten Weise in erwartete Ausgabe. Ich habe versucht, es endete immer verschiedene Fehler. Es wird hilfreich sein, und ich werde die Antwort akzeptieren, als auch, vielen Dank für die Bemühungen
wie wäre es jetzt?
Dein code ist gut, aber ich denke, die ursprüngliche Idee von @AsifAli zu verwenden
enumarate
imfor
Schleife anstatti = 0; i++
ist mehr pythonic (imo). Auch, schauen Sie bitte in meine Antwort bei derwith
- Anweisung.InformationsquelleAutor andrea-f