Seite 1 von 1

Dict speichern/lesen in Datei...

Verfasst: Mittwoch 28. Juli 2004, 21:42
von genrich
Hi...

Gibt es eigentlich eine möglichkeit einfach ein beliebiges Dict in eine Datei zu speichern und später wieder schnell zu lesen???
Am besten noch mehere Dict's in eine Datei :)

Genrich

Verfasst: Mittwoch 28. Juli 2004, 21:51
von Dookie

Verfasst: Donnerstag 29. Juli 2004, 08:27
von Milan
Hi. Pickle bzw Shelve könnte noch was für dich sein. Mit Pickle kannst du alle Pythonobjecte in Dateien speichern und mit Shelve machst aus Dateien selber Pythondicts.

Verfasst: Donnerstag 29. Juli 2004, 19:41
von genrich
Milan hat geschrieben:Pickle bzw Shelve könnte noch was für dich sein.
Ist sehr Interressant, funktioniert aber anscheinend nicht mit Dicts. Wenn ich versuche ein Dict mit pickle zu schreiben bekomme ich nur eine Fehlermeldung aus dem pickle Modul:

Code: Alles auswählen

  File "C:\Python\lib\pickle.py", line 1382, in dump
    Pickler(file, protocol, bin).dump(obj)
  File "C:\Python\lib\pickle.py", line 210, in __init__
    self.write = file.write

Code: Alles auswählen

Daten={"Text":"Ein Testtext"}
FileHandle = open("TestDatei.bin", 'w')
pickle.dump(FileHandle, Daten)

Verfasst: Donnerstag 29. Juli 2004, 19:53
von Dookie
Na wenn Du auch die Argumente vertauscht:

Code: Alles auswählen

import pickle
Daten={"Text":"Ein Testtext"}
FileHandle = open("TestDatei.bin", 'w')
pickle.dump(Daten, FileHandle)
Ginge auch aus der Fehlermeldung hervor, wenn Du die letzten Zeilen auch gepostet Hättest.

Code: Alles auswählen

AttributeError: 'dict' object has no attribute 'write'

Gruß

Dookie

Verfasst: Donnerstag 29. Juli 2004, 20:08
von genrich
Hab mir gerade mal "Shelve" angesehen, damit funktioniert es:
http://python.org/doc/2.3.4/lib/node76.html

Allerdings ist in den "Restrictions" (http://python.org/doc/2.3.4/lib/node75.html) zu lesen, das gleichzeitige Schreibzugriffe zu Fehlern in der Datenbank führen...

Ich weiß noch nicht, ob das bei mir wirklich vorkommen könnte... Ich will eigentlich damit auf dem Server Login-Daten abspeichern. Somit ist die Gefahr doch groß, das evtl. gleichzeitig mehr als ein Login stattfindet...

Nur, eine richtige SQL-Datenbank zu verwenden ist mir zu hoch...

Doch was passiert genau, wenn bei Shelve ein gleichzeitiger Schreibzugriff erfolgen würde? Ist die Datenbankdatei dann gleich Müll?

Verfasst: Donnerstag 29. Juli 2004, 20:15
von Milan
Hi. Ich habe keine Ahnung, was dann passiert. Du kannst auf jeden Fall die Dateien locken, wie dies mit flock gehen würde. Ich habe dazu früher unter win/lin das Modul portalocker benutzt. Wenn du aber nur einfach Daten speichern willst, so kannst du das auch wie oben beschrieben machen, die "Risiken", dass ein anderes Programm auf die Dateien genau dann zugreift, wenn du sie geöffnet hast sind die gleichen wie immer beim hantieren mit Dateien.

Verfasst: Freitag 30. Juli 2004, 19:55
von hans
Hmm, nur mal so eine Idee. Unter Linux gibt es einen Dienst SYSLOG. Gibt es soetwas nicht auch unter Windows? Dann würdest du diesem Dienst deine zu protollierenden Strings übergeben und den Rest macht das System, egal wieviele Logins gerade da sind, denn es schreibt ja nur SYSLOG.

Das Pythonmodul syslog ist leider nur für Unixe. Aber vielleicht bringt es ja jemanden auf eine Idee.

Hans

Verfasst: Mittwoch 11. August 2004, 17:27
von jens
Milan hat geschrieben:Pickle bzw Shelve könnte noch was für dich sein.
Wenn es nur darum geht Dictionaries in Strings und zurück zu bekommen, dafür hab ich mir ein eigenes kleines Pickle geschrieben.

Pickle.dumbs() bläht die Daten etwas mehr auf als meine Variante:

Code: Alles auswählen

def PickleDict(dict):
    # "\x00" -> chr(0) -> ASCII(0) - NUL
    # "\x01" -> chr(1) -> ASCII(1) - SOH
    Pickled=""
    for i in dict:
        Pickled+="\x00"+i+"\x01"+dict[i]
    return Pickled

def UnPickleDict(Pickled):
    dict={}
    for i in Pickled[1:].split("\x00"):
        temp=i.split("\x01")
        dict[temp[0]]=temp[1]
    return dict
Es ist bestimmt nicht die schnellste Variante :lol:

Verfasst: Montag 22. November 2004, 23:47
von jens
EDIT: Mein Posting war hier falsch :oops:

Verfasst: Dienstag 23. November 2004, 07:02
von mitsuhiko
Beim meinem pyWeb Modul habe ich die Sessions in Form eines Dict so gespeichert und geladen:

Code: Alles auswählen

#speichern
file("bla.txt", "w").write(str(liste));
#lesen
liste = eval(file("bla.txt").read());
Quick and Dirty Methode