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:

Code: Alles auswählen

sh[9]["Vorname"] = "Hyperion"
;-)

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:

Code: Alles auswählen

sh[9]["Vorname"] = "Hyperion"
;-)

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? :roll:

Re: shelve dateien

Verfasst: Freitag 25. April 2014, 20:37
von Leonidas
Und sowas wie

Code: Alles auswählen

for i in sh:
    del i
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.