Python: Wie kann man eine Liste mit Objekten in einer Datei speichern?

Ich versuche, verschiedene Objekte (mit Clases und Objekten) zu erstellen und sie in einer Datei zu speichern, um sie später zu bearbeiten oder zu retrieren. Wie sieht das aus.

GlobalCategories=[] GlobalContent=[] def LoadData(x,y): import pickle with open('bin.dat') as f: x,y = pickle.load(f) def SaveData(x,y): import pickle with open('bin.dat', 'wb') as f: pickle.dump([x,y], f) def Loader(x,y): try: LoadData(x,y) except: SaveData(x,y) 

Und das der Snippet das spart das zeigt, wie ich die Infos die Listen (tema ist die Klasse und die anderen Sachen sind die Methoden dieser Klasse):

 newtheme=Tema() newtheme.setInfo_name(newstr) newtheme.setInfo_code(newcode) GlobalCategories.append(newtheme) SaveData(GlobalContent,GlobalCategories) 

X und Y sind globale Listen, wo ich die Objekte speichere (ich habe bemerkt, dass es die Richtung in den Speicher jedes Objekts speichert), wenn ich es zuerst ausführen, schafft es die Datei und speichert die Infomation auf der Datei, aber wenn ich schließe Es versuch, es wieder auszuführen und die Info zu laden, löscht das Programm die Informationen und schafft die Datei wieder, also ist alles, was gespeichert wurde, weg.

Ich weiß nicht, ob dies eine prompte Art ist, Objekte zu speichern oder wenn es einen besseren Weg gibt, so dass jeder Rat sehr willkommen ist.

@abernert: Vielen Dank abarnert! Was ich tun möchte, ist, eine Liste mit zwei Listen zu speichern. Zum Beispiel eine Liste wird die a machen (toyota, nisan etc) und die andere Liste der Auto-Modell (Tundra, murano) zu speichern. Jetzt ist jedes Element ein Objekt, das ich zu einer Liste hinzufügen, wenn es erstellt wird. newtheme=Theme() newtheme.setInfo_name(newstr) GlobalCategories.append(newtheme) Dies ist, wie ich das Objekt in der globalen Liste speichere. GlobalCategories ist eine dieser beiden Listen, die ich später laden möchte, nachdem ich das Programm geschlossen habe (es wäre wie die Liste der Autofirmen aus dem Beispiel). Nun, wo ich das Problem habe, lade die Objekte aus den Listen, nachdem ich das Programm geschlossen und das Programm neu gestartet habe, weil ich in der Lage bin, sie aus der Liste zurückzuholen und zu bearbeiten, wenn ich die Shell nicht geschlossen habe. Ich muss laden und speichern die Marken und die Autos Objekte in der jeweiligen Liste, sobald ich das Programm starten, damit ich sie später manipulieren kann. Danke abernert noch einmal!

  • Schnelleres IO, das in dieser spezifischen Situation langsamere Ergebnisse liefert
  • Python 3.2 Eingabe Datum Funktion
  • Python-Multithreading-Interrupt-Eingang ()
  • Wie lese ich das Scrollrad aus, von / dev / input / mice?
  • So erhalten Sie mehrzeilige Eingabe vom Benutzer
  • Während die Schleife auf Eingabe python warten
  • 2 Solutions collect form web for “Python: Wie kann man eine Liste mit Objekten in einer Datei speichern?”

    Es ist schwer zu wissen, was das Problem ist ohne Kontext, wie Sie versuchen, Ihre LoadData und SaveData Funktionen verwenden. Allerdings ist hier eine kleine Demo, die tut was ich denke, dass Sie wollen.

     import pickle import random def load_data(): try: with open("bin.dat") as f: x, y = pickle.load(f) except: x, y = [], [] return x, y def save_data(data): with open("bin.dat", "wb") as f: pickle.dump(data, f) if __name__ == "__main__": x, y = load_data() print x, y x.append(random.randint(1, 10)) y.append(random.randint(1, 10)) save_data([x, y]) 

    AUSGANG VON KONSECUTIVE RUNS

     [] [] [9] [9] [9, 10] [9, 9] [9, 10, 2] [9, 9, 4] [9, 10, 2, 5] [9, 9, 4, 1] [9, 10, 2, 5, 6] [9, 9, 4, 1, 9] [9, 10, 2, 5, 6, 10] [9, 9, 4, 1, 9, 1] 

    Es ist schwer, sicher zu sein, aber ich vermute dein Problem ist, dass du eine Binärdatei schreibst und dann versuchst, es als Text zu lesen, und du benutzt Python 2.x unter Windows.

    In diesem Code:

     def LoadData(x,y): import pickle with open('bin.dat') as f: x,y = pickle.load(f) 

    Wenn Sie irgendwelche LF-Zeilenumbruchzeichen im Binär-Pickle-Stream haben, wird das Öffnen der Datei als Text in CR / LF-Paare umgewandelt. Dies wird dazu führen, dass die Gurke ungültig ist, und deshalb wird es eine Ausnahme auslösen.

    In diesem Code:

     def Loader(x,y): try: LoadData(x,y) except: SaveData(x,y) 

    … Sie schlucken nur irgendeine Ausnahme und speichern einige leere Werte.

    Wahrscheinlich möchten Sie hier nur IOError OSError Fehler behandeln ( IOError , OSError oder FileNotFoundError , abhängig von Ihrer Python-Version).

    Aber du willst definitiv die Ausnahme in eine Variable setzen, um dein Problem zu debuggen, wie folgt:

     def Loader(x,y): try: LoadData(x,y) except Exception as e: SaveData(x,y) 

    Du kannst einen Breakpoint auf die SaveData Linie im Debugger setzen oder einfach nur eine print(e) Zeile hinzufügen und die Ausgabe anschauen, um zu sehen, warum du da bist.


    Mittlerweile, auch wenn du das LoadData wird LoadData niemals etwas Nützliches machen. Zuweisen von x,y = pickle.load(f) rebt nur die lokalen Variablen x und y . Die Tatsache, dass sie die gleichen Namen wie die lokalen Variablen in Loader bedeutet nicht, dass Loader 's Variablen geändert werden. Auch die Tatsache, dass sie sich auf die gleichen Werte beziehen.

    Python hat keine "Referenzvariablen" oder "Ausgangsparameter". Der normale Weg, dies zu tun ist, um einfach Werte zurückzugeben, die Sie an den Anrufer zurückgeben möchten:

     def LoadData(): import pickle with open('bin.dat') as f: x,y = pickle.load(f) return x,y 

    Und natürlich muss Loader es richtig nennen:

     def Loader(x,y): try: x,y = LoadData() except: SaveData(x,y) 

    Und du hast genau das gleiche Problem in Loader , also Loader du es nochmal reparieren und in seinem Anrufer.

    Python ist die beste Programmiersprache der Welt.