shelve dateien

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
Luecx
User
Beiträge: 15
Registriert: Dienstag 4. März 2014, 12:16

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
Zuletzt geändert von Hyperion am Freitag 25. April 2014, 18:18, insgesamt 1-mal geändert.
Grund: Code in Python-Code-Tags gesetzt und Zeilenumbrüche eingefügt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Luecx
User
Beiträge: 15
Registriert: Dienstag 4. März 2014, 12:16

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': ''}
Zuletzt geändert von Leonidas am Freitag 25. April 2014, 20:36, insgesamt 2-mal geändert.
Grund: Code in Python-Tags gesetzt.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@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
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Luecx
User
Beiträge: 15
Registriert: Dienstag 4. März 2014, 12:16

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 !:)
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.
Luecx
User
Beiträge: 15
Registriert: Dienstag 4. März 2014, 12:16

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 ?
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.
Antworten