Mehrere Dict aus Datei picklen

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
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Huhu

Ich hab nen mal wieder nen Problem:

Code: Alles auswählen

 
raum_dict = [{"Tag": ""+tag, "Uhrzeit": ""+zeit, "Verantwortlicher": 
                  ""+verantwortlicher, "Teilnehmer": ""+teilnehmer}]
if len(raum_dict) >=1:
     raum_datei = open("raumbelegung.txt","a")
     pickle.dump(raum_dict, raum_datei)
     raum_datei.close()
else:
    raum_datei = open("raumbelegung.txt","w")
    pickle.dump(raum_dict, raum_datei)
    raum_datei.close()
Hiermit speicher ich 1 bzw mehrere dict in einer Datei.

So und mein Problem is jetzt:
Wenn ich mir die Datei mit

Code: Alles auswählen

datei = open("raumbelegung.txt","r")
raum = pickle.load(datei)
datei.close()
wieder laden möchte, dann lädt der mir nur 1 Dict in einer Liste er soll aber alle Dictionaries in einer Liste speichern.

Jemand ne Idee?

Besten Dank
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Ich seh da auch nur ein dict in der Liste. In dem Falle (len==1) überschreibst du ja die Datei immer. Warum erwartest du da dann mehr als ein Element? Schöner wäre da übrigens:

Code: Alles auswählen

if len(raum_dict) >=1:
     mode = "ab"
else:
     mode = "wb"
with  open("raumbelegung.txt", mode) as f
     pickle.dump(raum_dict, f)
raum_dict ist ein sehr irreführender Name. Es ist weder ein einzelner Raum noch ein dict. Ein passender Name wäre Räume. Aber Umlaute in Namen sind Problematisch. Darum (und nicht nur darum) solltest du alle Variablen Englisch benennen. Also in dem Fall rooms.

Gruss,
Jonas
Zuletzt geändert von veers am Samstag 24. April 2010, 16:44, insgesamt 1-mal geändert.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Man sollte Dateien immer mit "with" öffnen, damit diese auch sicher geschlossen werden:

Code: Alles auswählen

with open() as infile:
    # hier weiter

Code: Alles auswählen

raum_dict = [{"Tag": ""+tag, "Uhrzeit": ""+zeit, "Verantwortlicher":
                  ""+verantwortlicher, "Teilnehmer": ""+teilnehmer}]
Das sieht ziemlich "schlimm" aus. Was sollen denn diese sonderbaren String-Konkatenationen?

Ich kenne pickle nicht wirklich, aber kann es sein, dass Du eine zusammenhängende Datenstruktur benötigst, wie bei JSON?

In dem Fall Du legst eine Liste an, in der sich beliebig viele Dicts befinden können. Zu Beginn ist es eben ggf. keine. Vor jeder Speicher-Aktion lädst Du das bisherige Datenmodell und fügst das neue Dict in die Liste ein, dann speicherst Du die Struktur komplett.
BlackJack

@nubie2001: Wenn Du mehrere Objekte einzeln nacheinander schreibst, musst Du sie auch einzeln nacheinander wieder auslesen. Und `pickle`-Dateien sollte man immer im Binärmodus öffnen, sonst sind sie nicht plattformunabhängig austauschbar.

Was soll ``""+tag`` bewirken? Das macht nicht das was Du vielleicht von Java gewohnt bist. Wenn Du etwas in eine Zeichenkette umwandeln möchtest kannst Du die `str()`-Funktion verwenden.
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Hyperion hat geschrieben: Das sieht ziemlich "schlimm" aus. Was sollen denn diese sonderbaren String-Konkatenationen?
Argh, ich hab Schwachsinn geschrieben.
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Hier mal die Textdatei:

Code: Alles auswählen

(lp0
(dp1
S'Uhrzeit'
p2
S'10'
p3
sS'Tag'
p4
S'Mittwoch'
p5
sS'Teilnehmer'
p6
S'BaseHttpServer'
p7
sS'Verantwortlicher'
p8
S'Nubie2001'
p9
sa.(lp0
(dp1
S'Uhrzeit'
p2
S'17'
p3
sS'Tag'
p4
S'Donnerstag'
p5
sS'Teilnehmer'
p6
S'Marco Mueller'
p7
sS'Verantwortlicher'
p8
S'Max Mustermann'
p9
sa.
stehen ja im Moment 2 oder mehr Dicts drin und die muss ich beide dann ja auch wieder laden können.

Das Laden und Speichern mach ich in seperaten HTML Dateien
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

@nubie2001: BJ hat es doch schon geschrieben:
BlackJack hat geschrieben:@nubie2001: Wenn Du mehrere Objekte einzeln nacheinander schreibst, musst Du sie auch einzeln nacheinander wieder auslesen. Und `pickle`-Dateien sollte man immer im Binärmodus öffnen, sonst sind sie nicht plattformunabhängig austauschbar.
In der Dokumentation zu pickle findest du das unter "Example", beachte allerdings unbedingt die zusätzlichen Hinweise hier in diesen Thread, die Beispiele sind nicht so optimal.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Also sorry aber ich komm einfach net weiter hab jetzt sämtliche Sachen probiert aber ich schaffs net
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

nubie2001 hat geschrieben:Also sorry aber ich komm einfach net weiter hab jetzt sämtliche Sachen probiert aber ich schaffs net
Dann zeig uns mal, was du versucht hast, sonst können wir dir auch nicht helfen!
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Code: Alles auswählen

datei = open("raumbelegung.txt","rb")
            blub = pickle.load(datei)
            datei.close()
            for line in blub:
                self.wfile.write('''
                <td align ='center'>'''+line['Tag']+'''</td>
                <td align ='center'>'''+str(int(line['Uhrzeit'])-8)+''' Stunde(n)</td>
                <td align ='center'>'''+line['Verantwortlicher']+'''</td>
                <td align ='center'>'''+line['Teilnehmer']+'''</td>
                </tr>''') 

Code: Alles auswählen

            datei = open("raumbelegung.txt","rb")
            blub = pickle.load(datei.readlines())
            datei.close()
            for line in blub:
                self.wfile.write('''
                <td align ='center'>'''+line['Tag']+'''</td>
                <td align ='center'>'''+str(int(line['Uhrzeit'])-8)+''' Stunde(n)</td>
                <td align ='center'>'''+line['Verantwortlicher']+'''</td>
                <td align ='center'>'''+line['Teilnehmer']+'''</td>
                </tr>''')     
Naja und noch nen paar Sachen die ich aber mitlerweile wieder verworfen hab
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso packst Du nicht einfach die Dictionaries in eine Liste?

Code: Alles auswählen

In [51]: data = [{"foo": 1}, {"bar": 42}]

In [52]: raw = pickle.dumps(data)

In [53]: print pickle.loads(raw)
-------> print(pickle.loads(raw))
[{'foo': 1}, {'bar': 42}]

In [54]: for item in pickle.loads(raw):
   ....:     print item
   ....:
   ....:
{'foo': 1}
{'bar': 42}
Zudem solltest Du dringend über eine Template-Engine nachdenken, z.B. jinja2.
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Das Problem ist:
Ich hab ne Datei in der 1 bis n Dictionaries stehen und diese 1 bis n Dictionaries muss ich auslesen aus der Datei und dann nacheinander in einer HTML Tabelle ausgeben.

1 Dictionary krieg ich wunderbar ausgelesen aber sobald mehrere drin steht liest er immer nur noch das erste aus :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

nubie2001 hat geschrieben:Das Problem ist:
Ich hab ne Datei in der 1 bis n Dictionaries stehen und diese 1 bis n Dictionaries muss ich auslesen aus der Datei und dann nacheinander in einer HTML Tabelle ausgeben.
Oben hast Du doch noch selber gezeigt, wie Du die Datei anlegst! Also kannst Du nun das Format beeinflussen oder nicht? Ich habe Dir ja einen Weg gezeigt, wie es klappt. Wenn Du den nicht nutzen willst oder kannst, wirst Du wohl weiter suchen müssen.

Und Du solltest nach wie vor eine Template Engine nutzen ;-)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Hyperion hat geschrieben:
nubie2001 hat geschrieben:Das Problem ist:
Ich hab ne Datei in der 1 bis n Dictionaries stehen und diese 1 bis n Dictionaries muss ich auslesen aus der Datei und dann nacheinander in einer HTML Tabelle ausgeben.
Oben hast Du doch noch selber gezeigt, wie Du die Datei anlegst! Also kannst Du nun das Format beeinflussen oder nicht? Ich habe Dir ja einen Weg gezeigt, wie es klappt. Wenn Du den nicht nutzen willst oder kannst, wirst Du wohl weiter suchen müssen.
Oder du verwendest gleich `sqlite` um die Daten zu speichern. Das scheint mir in deinem Fall gar nicht so falsch zu sein, deine Daten eignen sich gut für eine relationale Datenbank.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Ja wenn ich das dürfte hät ich des schon gemacht nur ich muss die Kacke für die Uni machen und mein Prof hat strikte vorgaben
Antworten