Seite 1 von 1
shelve dateien
Verfasst: Freitag 25. April 2014, 17:26
von Luecx
Hallo liebes forum,
ich habe gerade ein Problem mit einem meiner Programme, ich steh einfach auf dem schlauch und komm nicht weiter.
Ich habe eine Shelve Datei,
Code: Alles auswählen
sh[str(i)]={"Mietglied":"",
"Vorname":"Hallo",
"Eintritt":"",
"Geburt":"",
"Alter":"",
"Geschlecht":"",
"Probezeit":"",
"Austritt":"",
"Team":"",
"registriert durch":"",
"Aktiv":""}
soweit funktioniert das alles, ich kann drauf zugreifen etc. jedoch wie kann ich genau einen wert verändern, z.B wenn ich bei sh[9]["Vorname"] eingebe kann ich den Namen halt sehen, doch nicht verändern.
mfg Luecx
Re: shelve dateien
Verfasst: Freitag 25. April 2014, 18:20
von Hyperion
Luecx hat geschrieben:
... jedoch wie kann ich genau einen wert verändern, z.B wenn ich bei sh[9]["Vorname"] eingebe kann ich den Namen halt sehen, doch nicht verändern.
Du suchst eine Zuweisung:
Sollte eigentlich in jedem Tutorial vorkommen! Z.B. im
offiziellen Tutorial
Das steht auch in der
Doku zu ``shelve`` im Beispiel gleich als dritte Anweisung

Re: shelve dateien
Verfasst: Freitag 25. April 2014, 18:43
von Luecx
Hyperion hat geschrieben:Luecx hat geschrieben:
... jedoch wie kann ich genau einen wert verändern, z.B wenn ich bei sh[9]["Vorname"] eingebe kann ich den Namen halt sehen, doch nicht verändern.
Du suchst eine Zuweisung:
Sollte eigentlich in jedem Tutorial vorkommen! Z.B. im
offiziellen Tutorial
Das steht auch in der
Doku zu ``shelve`` im Beispiel gleich als dritte Anweisung

hab ich auch schon ausprobiert aber es hat einfach nicht geklappt....:S das kommt bei mir raus :
Code: Alles auswählen
import shelve
import os
Pfad=os.getcwd()
sh=shelve.open(Pfad+"mit1glieder.slv")
for i in sh:
del i
sh["1"]={'Geburt': '', 'Eintritt': '', 'Mietglied': '', 'Vorname': '', 'Aktiv': '', 'Team': '', 'Geschlecht': '', 'registriert durch': '', 'Austritt': '', 'Alter': '', 'Probezeit': ''}
print(sh["1"])
sh["1"]["Vorname"]="Norbert"
print(sh["1"])
sh.close()
und im output steht:
{'Geburt': '', 'Eintritt': '', 'Mietglied': '', 'Vorname': '', 'Aktiv': '', 'Team': '', 'Geschlecht': '', 'registriert durch': '', 'Austritt': '', 'Alter': '', 'Probezeit': ''}
{'Geburt': '', 'Eintritt': '', 'Mietglied': '', 'Vorname': '', 'Aktiv': '', 'Team': '', 'Geschlecht': '', 'registriert durch': '', 'Austritt': '', 'Alter': '', 'Probezeit': ''}
Re: shelve dateien
Verfasst: Freitag 25. April 2014, 18:47
von Hyperion
Luecx hat geschrieben:
hab ich auch schon ausprobiert aber es hat einfach nicht geklappt....:S
Und wie genau äußert sich das? Und wenn Du es schon probiert hast, wieso sagst Du uns das nicht?

Re: shelve dateien
Verfasst: Freitag 25. April 2014, 20:37
von Leonidas
Und sowas wie
ist auch völlig sinnfrei.
Als Tipp: Pfade nicht mit ``+`` zusammensetzen sondern mit ``os.path.join``.
Re: shelve dateien
Verfasst: Freitag 25. April 2014, 21:26
von mutetella
@Luecx
Laut
Doku zu `shelve`:
Because of Python semantics, a shelf cannot know when a mutable persistent-dictionary entry is modified. [...] 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).
Du solltest also das shelve-Objekt mit ``writeback=True`` öffnen:
Code: Alles auswählen
In [61]: test
Out[61]: {'Vorname': 'Norbert'}
In [62]: test['Vorname'] = 'Rudi'
In [63]: test
Out[63]: {'Vorname': 'Rudi'}
In [64]: test.close()
Die Frage ist, weshalb Du `shelve` zum Speichern eines Dictionaries verwenden möchtest?
mutetella
Re: shelve dateien
Verfasst: Samstag 26. April 2014, 10:17
von Luecx
mutetella hat geschrieben:@Luecx
Laut
Doku zu `shelve`:
Because of Python semantics, a shelf cannot know when a mutable persistent-dictionary entry is modified. [...] 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).
Du solltest also das shelve-Objekt mit ``writeback=True`` öffnen:
Code: Alles auswählen
In [61]: test
Out[61]: {'Vorname': 'Norbert'}
In [62]: test['Vorname'] = 'Rudi'
In [63]: test
Out[63]: {'Vorname': 'Rudi'}
In [64]: test.close()
Die Frage ist, weshalb Du `shelve` zum Speichern eines Dictionaries verwenden möchtest?
mutetella
also ich will eine datenbank erstellen mit den angegebenen werten. und zu dem "del i" ich wollt erstmal alles löschen und dann etwas neues erstellen. habs jetzt mit dem writeback getestet. vielen dank es funktioniert jetzt !:)
Re: shelve dateien
Verfasst: Samstag 26. April 2014, 10:27
von BlackJack
@Luecx: Das ``del i`` löscht aber nichts, jedenfalls keine Daten. ``del name`` löscht den *Namen* aber nicht das Objekt was an den Namen gebunden ist.
Re: shelve dateien
Verfasst: Samstag 26. April 2014, 10:31
von Luecx
BlackJack hat geschrieben:@Luecx: Das ``del i`` löscht aber nichts, jedenfalls keine Daten. ``del name`` löscht den *Namen* aber nicht das Objekt was an den Namen gebunden ist.
wie müsste ich es dann richtig schreiben? del sh
?
Re: shelve dateien
Verfasst: Samstag 26. April 2014, 10:43
von BlackJack
@Luecx: Um *ein* Schlüssel/Wert-Paar zu löschen ja. Wenn Du das in einer Schleife aufrufst, musst Du aber vorsichtig sein, dass Du dir vorher als Schlüssel als Liste geben lässt und nicht über das Shelve-Objekt iterierst während Du Elemente löschst und es damit veränderst.
Man könnte sich die Schleife aber auch sparen und einfach die `clear()`-Methode aufrufen.