Mehrdimensionale Dictionaries und Shelves

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
Benutzeravatar
Mapache23
User
Beiträge: 7
Registriert: Mittwoch 8. Februar 2012, 09:07

Ich würde gerne ein "shelve" benutzen, um ein mehrdimansionales Dictionary persitent zu halten.
Allerdings habe ich festgestellt, dass sich ein "shelve" entgegen der Beschreibung in der Dokumentation anders verhält als ein Dictionary. (s.u.)

Code: Alles auswählen

 159: db_shelf = shelve.open("test.s")
 160: db_shelf["Main"] = {}
 161: db_shelf
{'Main': {}}
 162: db_shelf["Main"]["Sub"] = {}
 163: db_shelf
{'Main': {}}
 165: db_dict = {}
 166: db_dict["Main"] = {}
 167: db_dict["Main"]["Sub"] = {}
 168: db_dict
{'Main': {'Sub': {}}}
Kann mir jemand sagen, wie ich diese mehrdimensionalen Dictionaries in ein Shelve speichern kann?
Ich hatte schon über "sqlite" nachgedacht, aber da ich in einigen Loops über die unteren Dimensionen des Dictionaries iterieren möchte und diese sich in Anzahl und Werten unterscheiden können, bin ich wieder davon abgekommen.
Ich möchte etwas persistentes, weil sich der Eingabestrom, aus dem das Dictionary generiert wird, täglich ändert und mit den alten Werten verglichen werden soll.
Am Ende kann so eine Struktur eben so aussehen:

Code: Alles auswählen

In [190]: db_dict
Out[190]: 
{'Main': {'Sub1': {'type': 33}, 'Sub2': {'type': 444}},
 'Main-2': {'Sub1': {'count': 100, 'type': 678}, 'Sub2': {'count': 180}}}
deets

Doku lesen hilft:

http://docs.python.org/library/shelve.html

"""
Because of Python semantics, a shelf cannot know when a mutable persistent-dictionary entry is modified. By default modified objects are written only when assigned to the shelf (see Example). If the optional writeback parameter is set to True, all entries accessed are also cached in memory, and written back on sync() and close(); this can make it handier to mutate mutable entries in the persistent dictionary, but, if many entries are accessed, it can consume vast amounts of memory for the cache, and it can make the close operation very slow since all accessed entries are written back (there is no way to determine which accessed entries are mutable, nor which ones were actually mutated).
"""

Code: Alles auswählen

import shelve
s = shelve.open("/tmp/test.s", writeback=True)
s["Main"] = {}
s["Main"]["Sub"] = {}
print repr(s)
Benutzeravatar
Mapache23
User
Beiträge: 7
Registriert: Mittwoch 8. Februar 2012, 09:07

Ich hab's hin bekommen.
Danke, aber die Doku hab ich schon gelesen. Hatte aber nach einer Lösung gefragt.

Was ich mache ist, dem Shelve das mehrdimensionale Array zuzuordnen.
Ich arbeite zwar beim Programmablauf nicht direkt mit dem Shelve, aber die Hauptfunktion - nämlich das Abspeichern eines mehrdimensionalen Dictionaries - wird erfüllt. Beim nächsten Programlauf kann ich auf den Key des letzten zugreifen.

Code: Alles auswählen

db_win_server_shelve = shelve.open("db_win_server.s") # das Shelve für die Speicherung am Ende
db_win_server = {} # mit dem Dictionary kann ich mehrdimensionale Informationen abbilden

# Mehrdimensionales Dictionary wird gefüllt
...

# Dann wird es dem Shelve zugewiesen - Primary Key ist das aktuelle Datum
actual_date = time.strftime("%d%m%Y")
db_win_server_shelve[actual_date] = db_win_server
db_win_server_shelve.close()
deets

Mapache23 hat geschrieben:Ich hab's hin bekommen.
Danke, aber die Doku hab ich schon gelesen. Hatte aber nach einer Lösung gefragt.
Die hatte ich dir ja auch genannt - writeback=True benutzen.
Benutzeravatar
Mapache23
User
Beiträge: 7
Registriert: Mittwoch 8. Februar 2012, 09:07

Klasse. Arg.
Dann hab ich das jetzt schon zwei Mal übersehen.

Dank Dir sehr für die Geduld und den zweiten Versuch mir die Augen zu öffnen.
*verbeug*
Antworten