Dict speichern/lesen in 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
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

[code]#!/usr/bin/env python
import this[/code]
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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)
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
[code]#!/usr/bin/env python
import this[/code]
genrich
User
Beiträge: 91
Registriert: Sonntag 27. Juni 2004, 17:46

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?
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

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.
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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:
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

EDIT: Mein Posting war hier falsch :oops:
Zuletzt geändert von jens am Dienstag 23. November 2004, 13:01, insgesamt 1-mal geändert.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
Antworten