Speichern einer Deque in eine Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
CamelCase
User
Beiträge: 6
Registriert: Donnerstag 17. November 2011, 08:16
Wohnort: 66333 Völklignen

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.....
Gibt Dir das Leben ne Zitrone, mach Limonade draus !!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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])
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
CamelCase
User
Beiträge: 6
Registriert: Donnerstag 17. November 2011, 08:16
Wohnort: 66333 Völklignen

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.....
Gibt Dir das Leben ne Zitrone, mach Limonade draus !!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
CamelCase
User
Beiträge: 6
Registriert: Donnerstag 17. November 2011, 08:16
Wohnort: 66333 Völklignen

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
Gibt Dir das Leben ne Zitrone, mach Limonade draus !!
BlackJack

@CamelCase: Wurde doch bereits gesagt: Du must `close` *aufrufen* und nicht einfach nur referenzieren.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Gleiches gilt auch fuer `F1.clear`, das sollte `F1.clear()` heissen.

Warum du beim wiedereinlesen dann wieder kein `with` benutzt ist mir schleierhaft ..
CamelCase
User
Beiträge: 6
Registriert: Donnerstag 17. November 2011, 08:16
Wohnort: 66333 Völklignen

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.......
Gibt Dir das Leben ne Zitrone, mach Limonade draus !!
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

CamelCase hat geschrieben:Pyscripter motzt doch sonst bei jedem kleinen Fehlerchen rum.......
Das ist ja streng genommen auch kein Fehler, lediglich nutzlos.
the more they change the more they stay the same
BlackJack

Wird zum Beispiel von pylint in der Regel auch erkannt als Anweisung ohne Effekt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
"""
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Warum nicht gleich so (beim iterieren auspacken)?

Code: Alles auswählen

>>> for german, italian in words:
...     print(german, italian)
... 
Messer Coltello
Eis Gelatti
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

derdon hat geschrieben:Warum nicht gleich so (beim iterieren auspacken)?
Weil... ich es nie lernen werde :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten