2016-05-16 6 views
0

Ich habe ein einfaches Programm, das Eingaben vom Benutzer nimmt und sie in ein Diktat schreibt. Nachdem dann möchte ich, dass die Daten in JSON-Datei speichern (Ich suchte und nur json nützlich gefunden)Daten eines Diktats in JSON speichern

zum Beispiel

mydict = {} 

while True: 
    user = input("Enter key: ") 
    if user in mydict.keys(): #if the key already exist only print 
     print ("{} ---> {}".format(user,mydict[user])) 
     continue 

    mn = input("Enter value: ") 
    app = input ("Apply?: ") 

    if app == "y": 
     mydict[user] = mn 
     with open ("mydict.json","a+") as f: 
      json.dump(mydict,f) 

    with open ("mydict.json") as t: 
     mydict = json.load(t) 

Jedes Mal Benutzer einen Schlüssel und Wert eingeben, möchte ich sie in dict hinzuzufügen, Danach speichern Sie das Diktat in der JSON-Datei. Und jedes Mal, wenn ich diese JSON-Datei lesen möchte, kann ich das Diktat im Programm aktualisieren.

Die oben genannten Codes wurden erhöht ValueError: Extra data:. Ich habe verstanden, dass ein Fehler aufgetreten ist, weil ich jedes Mal das Dict zur JSON-Datei hinzufüge, so dass es mehr als ein Diktat gibt. Aber wie kann ich das ganze dict auf einmal hinzufügen? Ich wollte den w Modus nicht verwenden, weil ich die Datei nicht überschreiben möchte und ich neu in Json bin.

Programm muss unendlich sein und ich muss das Diktat jedes Mal aktualisieren, deshalb konnte ich keine Lösung finden oder irgendetwas versuchen, da ich neu bei Json bin.

+1

Sie * sollten * die Datei überschreiben wollen, da das JSON-Dateiformat das Anhängen nicht zulässt. –

+0

@SteveJessop Also muss ich einfach 'w' Modus verwenden – GLHF

+0

Schreiben Sie einfach' if user in mydict: ' –

Antwort

1

Wenn Sie JSon verwenden möchten, müssen Sie beim Öffnen der Datei zum Schreiben die Option 'w' verwenden. Mit der Option "a +" wird das vollständige Diktat direkt nach der zuvor gespeicherten Version an die Datei angehängt.

Warum würden Sie nicht stattdessen CSV verwenden? Mit ‚A +‘ Option, jede neu eingegebenen Nutzerinformationen werden an das Ende der Datei angehängt werden und der Transformation der Inhalt bei Lesezeit zu einem dict ist ganz einfach und sollte wie folgt aussehen etwas:

import csv 
with open('your_dict.json', 'r') as fp: 
    yourDict = {key: value for key,value in csv.reader(fp, delimiter='\t') 

während die rettende Gegenstück würde aussehen wie:

yourDictWriter = csv.writer(open('your_dict.json','a+'), delimiter='\t')) 
#... 
yourDictWriter.writerow([key, value]) 
0

Ein anderer Ansatz wäre, MongoDB, eine Datenbank zum Speichern von JSON-Dokumenten zu verwenden. Dann müssen Sie sich keine Gedanken mehr darüber machen, Dateien zu überschreiben, json zu codieren und so weiter, da die Datenbank und der Treiber dies für Sie übernehmen. (. Beachten Sie auch, dass es macht den Code kurz) Angenommen, Sie haben MongoDB installiert und ausgeführt wird, können Sie es wie diese verwenden:

import pymongo 
client = MongoClient() 
db = client.test_database.test_collection 

while True: 
    user = input("Enter key: ") 
    if db.find_one({'user': user}) #if the key already exist only print 
     print ("{} ---> {}".format(user, db.find_one({'user':user})['value']) 
     continue 

    mn = input("Enter value: ") 
    app = input ("Apply?: ") 

    if app == "y": 
     db.insert({'user':user, 'value':value}) 
0

mit Ihrem Code, wie es jetzt ist, haben Sie keinen Grund zu anhängen die Datei. Sie konvertieren das gesamte dict in JSON und schreiben es trotzdem in die Datei. Es ist also egal, ob Sie die vorherigen Daten verlieren. a ist hier nicht effizienter als w. In der Tat ist es schlimmer, weil die Datei viel mehr Speicherplatz auf der Festplatte benötigt.

Die Verwendung des CSV-Moduls, wie Schmouk sagt, ist ein guter Ansatz, solange Ihre Daten eine einfache Struktur haben. In diesem Fall haben Sie nur eine Tabelle mit zwei Spalten und vielen Zeilen, daher ist eine CSV-Datei geeignet und auch effizienter.

Wenn jede Zeile eine komplexere Struktur hat, z. B. geschachtelte Dicts und/oder Listen oder unterschiedliche Felder für jede Zeile, ist JSON nützlicher. Sie können immer noch eine Zeile anhängen. Schreiben Sie einfach jede Zeile in eine einzelne Zeile, und jede Zeile ist ein eigenes JSON-Objekt. Das Lesen von Dateien Zeile für Zeile ist in Python normal und einfach.

Übrigens sind die letzten beiden Zeilen nicht erforderlich. Sie müssen nur den JSON einlesen, wenn das Programm startet (wie Moses Ihnen gezeigt hat), so dass Sie Zugriff auf Daten von vorherigen Läufen haben. Danach können Sie einfach die Variable mydict verwenden und es werden alle Schlüssel gespeichert, die Sie hinzugefügt haben.