wie bestimmtes Element aus shelve lesen

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
dinsdale
User
Beiträge: 2
Registriert: Mittwoch 14. Februar 2007, 01:48

Hallo,

ich bin noch Python-Anfaenger und hab nun eine eine programmiertechnische Frage...:
Wie kann ich in einem shelve auf ein bestimmtes Element zugreifen ohne dass ich ueber alle Keys laufen muss.
Ich schreibe ein tuple "status_Now" in mein shelve und benutze als Key die aktuelle Zeit

Code: Alles auswählen

 skim_db = shelve.open("test.dat","c",writeback=1)
    skim_db[str(EpochSeconds_Now)]= status_Now
    skim_db.sync()
    skim_db.close()
Jetzt will ich die beiden letzten Elemente vergleichen -- aber ich will vermeiden ueber alle Keys laufen zu muessen, da ich ja weiss, welche Elemente ich bearbeiten will.
skim_db[-1] funktioniert leider nicht :cry:
Gibt es eine Moeglichkeit direkt auf bestimmte Elemente zuzugreifen?

Danke fuer alle Tipps,
Thomas
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

dinsdale hat geschrieben:Jetzt will ich die beiden letzten Elemente vergleichen
Hallo Thomas!

Willkommen im Python-Forum!

Shelve verhält sich wie ein Dictionary und nicht wie eine Liste. Bei einem Dictionary kannst du nur auf benannte Elemente zugreifen und nicht auf das Vorletzte oder das zehnte. Das geht nicht.

Du könntest dir aber irgendwo eine Liste der Elemente in der von dir gewünschten Reihenfolge abspeichern. -- Sogar ins Shelve selbst.

Code: Alles auswählen

>>> import shelve
>>> sh = shelve.open("J:\\Ablage\\shelvetest.shelve")
>>> sh_index = []
>>> person1 = {"vorname": "Max", "nachname": "Thompson"}
>>> sh["person1"] = person1
>>> sh_index.append("person1")
>>> person15 = {"vorname": "Maxi", "nachname": "Mustermann"}
>>> sh["person15"] = person15
>>> sh_index.append("person15")
>>> # Erste, eingefügte Person anzeigen
>>> sh[sh_index[0]]
{'nachname': 'Thompson', 'vorname': 'Max'}
>>> # Letzte, eingefügte Person anzeigen
>>> sh[sh_index[-1]]
{'nachname': 'Mustermann', 'vorname': 'Maxi'}
>>> # Du kannst den Index auch ins Shelve packen
>>> sh["sh_index"] = sh_index
>>> person30 = {"vorname": "Tom", "nachname": "Dreissger"}
>>> sh["person30"] = person30
>>> sh_index = sh["sh_index"]
>>> sh_index.append("person30")
>>> sh["sh_index"] = sh_index
>>> # Letzte, eingefügte Person anzeigen
>>> sh[sh["sh_index"][-1]]
{'nachname': 'Dreissger', 'vorname': 'Tom'}
>>> sh.close()
>>> 
Das Speichern des Index (also der Liste) im Shelve selbst, begrenzt aber auch die Geschwindigkeit des Shelve bei vielen tausenden Einträgen. Der Index wird ja immer größer und muss immer wieder komplett neu geschrieben und im Ganzen ausgelesen werden. Aber unter ein paar tausend Einträgen würde ich mir kein Problem damit machen. Du könntest den Index ja auch begrenzen. Wenn du immer nur die letzten 100 Einträge brauchst, dann kannst du den Index ja auch auf diese Einträge begrenzen.
Wenn es mehr werden sollte, oder wenn du weitere Suchmöglichkeiten brauchst, dann würde ich mir den Einsatz einer Datenbank überlegen. SQLite ist da ein guter Anfang.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
dinsdale
User
Beiträge: 2
Registriert: Mittwoch 14. Februar 2007, 01:48

Hallo Gerold,

vielen Dank fuer Deine Antwort.
Eine echte Datenbank kommt vielleicht spaeter -- im Moment "spiele" ich noch etwas und eine Datanbank waeren noch Kanonen auf Spatzen :wink:
Wahrscheinlich werde ich eine Liste nehmen und meine Zustaende als Tupel reinfuellen. Macht es dann eigentlich Sinn ein shelve zu nehmen oder wuerde picklen ausreichen (wobei mir nicht ganz klar ist, was der grossartige Unterschied ist (naiv: ein shelve ist wie ein gepickeltes Objekt nur mit Dictionary-Erweiterung? :wink: )

Gruesse & Danke,
Thomas
BlackJack

Ein `pickle` ist ein Objekt (das andere Objekte enthalten kann) komplett in eine Datei serialisiert. Kann man nur komplett lesen und schreiben. Ein `shelve` enthält viele `pickle`s auf die man über einen Schlüssel (Zeichenkette) zugreifen kann, verhält sich ungefähr wie ein Dictionary. Die einzelnen Werte zu den Schlüsseln werden nur geladen, wenn man darauf zugreift.

SQLite ist als Datenbank keine Kanone auf Spatzen. Die DB ist sehr "leichtgewichtig". Nur die API ist etwas komplizierter als ein einfaches Dictionary. Aber so kompliziert ist SQL letztendlich auch nicht.
Antworten