Seite 1 von 1

Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 18:48
von CamelCase
Hallo Leute,

stehe gerade etwas auf dem Schlauch beim speichern einer Deque in eine Datei. :K

Pickle funktioniert offenbar bei einer Deque nicht.

Den Umweg, die Deque in eine normale Liste einzulesen und dann abzuspeichern(Pickle, Text-Datei...) wollte ich eigentlich vermeiden.
Die Deque direkt in ein Textfile zu speichern, geht natürlich. Nur dann gibts natürlich Probleme beim wiedereinlesen!

Inhalt der Deque: Stringobjekt. Aufbau: "Frage|Antwort" (Für eine Lernkartei)

Weiß jemand zufällig eine andere Lösung ? (Nein, bitte keine Datenbank..... schon ausprobiert........)

Beim "gurgeln" leider nix verwertbares im Web gefunden......
Nur einige diffuse Hinweise, daß Pickle bis auf wenige Ausnahmen auf alle Python-Objekte anwendbar ist.....

Die Deque wäre das ideale Datenmodell/Datencontainer für meine Lernkartei, deshalb wäre mir am direkten abspeichern der selben in eine Datei sehr gelegen.

Der Umweg über einen anderen Datencontainer zum Speichern würde das ganze ja nicht unbedingt beschleunigen.......

Grüße

CamelCase der genervte.....

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 19:08
von Hyperion
CamelCase hat geschrieben: Pickle funktioniert offenbar bei einer Deque nicht.
Huch... wie kommst Du denn da drauf?

Code: Alles auswählen

In [10]: import pickle

In [11]: from collections import deque

In [12]: d = deque((1,2,3))

In [13]: s = pickle.dumps(d)

In [14]: pickle.loads(s)
Out[14]: deque([1, 2, 3])

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 19:32
von CamelCase
Hyperion hat geschrieben:
CamelCase hat geschrieben: Pickle funktioniert offenbar bei einer Deque nicht.
Huch... wie kommst Du denn da drauf?

Code: Alles auswählen

In [10]: import pickle

In [11]: from collections import deque

In [12]: d = deque((1,2,3))

In [13]: s = pickle.dumps(d)

In [14]: pickle.loads(s)
Out[14]: deque([1, 2, 3])
weil DAS nicht funktioniert:

Code: Alles auswählen

import pickle
import collections

F1=collections.deque("")

#erweitern
F1.append("Messer|Costello")
F1.append("Eis|Gelati")
F1.append("Schwein|Porci")

# speichern
datei=open("fach1.krt","wb")
pickle.dump(F1,datei)
datei.close
obwohl der Inhaltstest mit print() die Deque korrekt wiedergibt, is die Datei so leer wie mein Geldbeutel........

PS: mit pickle.dumps funktionierts auch nich.....

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 19:49
von cofi
Du solltest `datei.close` auch aufrufen, oder besser noch

Code: Alles auswählen

with open('fach1.krt', 'wb') as datei:
    pickle.dump(F1, datei)
benutzen.

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 21:30
von CamelCase
cofi hat geschrieben:Du solltest `datei.close` auch aufrufen, oder besser noch

Code: Alles auswählen

with open('fach1.krt', 'wb') as datei:
    pickle.dump(F1, datei)
benutzen.
Super, das passt !!

Code: Alles auswählen

import pickle
import collections

F1=collections.deque("")

#erweitern
F1.append("Messer|Coltello")
F1.append("Eis|Gelati")
F1.append("Schwein|Porco")
F1.append("Wildschwein|Singularis Porcus")
F1.append("Postbote|Il Postino")
F1.append("Finanzamt|Mafia")

with open('fach1.krt', 'wb') as datei:
    pickle.dump(F1, datei)

#deque leeren
F1.clear

# testweise wieder einlesen
datei=open("fach1.krt","rb")
F1=pickle.load(datei)
datei.close

# Testen ob Deque funktioniert
F1.rotate(-1)
print(F1)

# passt.......
Warum die andere Version beim Speichern nicht funktioniert, is mir im Moment
wirklich noch etwas schleierhaft...... Vielleicht komm ich ja noch drauf.........

Villemols Merci auch! Hilft mir sehr weiter !

Grüßle

CamelCase

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 21:35
von BlackJack
@CamelCase: Wurde doch bereits gesagt: Du must `close` *aufrufen* und nicht einfach nur referenzieren.

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 21:42
von cofi
Gleiches gilt auch fuer `F1.clear`, das sollte `F1.clear()` heissen.

Warum du beim wiedereinlesen dann wieder kein `with` benutzt ist mir schleierhaft ..

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 22:12
von CamelCase
BlackJack hat geschrieben:@CamelCase: Wurde doch bereits gesagt: Du must `close` *aufrufen* und nicht einfach nur referenzieren.
DEN Schreibfehler hab ich jetzt auch bemerkt............ :wink:

Pyscripter motzt doch sonst bei jedem kleinen Fehlerchen rum.......

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 22:16
von Dav1d
CamelCase hat geschrieben:Pyscripter motzt doch sonst bei jedem kleinen Fehlerchen rum.......
Das ist ja streng genommen auch kein Fehler, lediglich nutzlos.

Re: Speichern einer Deque in eine Datei

Verfasst: Sonntag 22. Juli 2012, 22:33
von BlackJack
Wird zum Beispiel von pylint in der Regel auch erkannt als Anweisung ohne Effekt.

Re: Speichern einer Deque in eine Datei

Verfasst: Montag 23. Juli 2012, 18:34
von Hyperion
Vielleicht noch eine Anmerkung zu Deinem "Inhalt":

Code: Alles auswählen

F1.append("Messer|Coltello")
F1.append("Eis|Gelati")
F1.append("Schwein|Porco")
F1.append("Wildschwein|Singularis Porcus")
F1.append("Postbote|Il Postino")
F1.append("Finanzamt|Mafia")
Wenn Du schon eine Lib zum Serialisieren von Datenstrukturen benutzt - im Falle von `pickle` sogar eine sehr mächtige -, dann solltest Du Dir evtl. mal überlegen, ob Du da wirklich etwas sinnvolles reinschreibst.

Im Endeffekt "missbrauchst" Du `pickle` hier als CSV mit einem "|" als Trenner ;-)

Offenbar hast Du da Wertpaare; diese kannst Du doch einfach in Tupeln verwalten:

Code: Alles auswählen

from collections import deque

words = deque()
words.append(("Messer", "Coltello"))
words.append(("Eis", "Gelatti"))

for pair in words:
    german, italian = pair
    print(german, italian)

"""
>>> Messer Coltello
>>> Eis Gelatti
"""

Re: Speichern einer Deque in eine Datei

Verfasst: Dienstag 24. Juli 2012, 00:01
von derdon
Warum nicht gleich so (beim iterieren auspacken)?

Code: Alles auswählen

>>> for german, italian in words:
...     print(german, italian)
... 
Messer Coltello
Eis Gelatti

Re: Speichern einer Deque in eine Datei

Verfasst: Dienstag 24. Juli 2012, 16:53
von Hyperion
derdon hat geschrieben:Warum nicht gleich so (beim iterieren auspacken)?
Weil... ich es nie lernen werde :mrgreen: