Pickle Datei in "lesbare" Datei wandeln...???

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
Crady
User
Beiträge: 18
Registriert: Freitag 31. Oktober 2008, 18:58

Hallo, zusammen!

Wieder einmal stehe ich auf der Leitung:

Ich möchte ein mit Pickle erzeugtes file in ein "lesbares" Format speichern um es auf einer Webseite anzuzeigen.

Das Einlesen des files klappt ohne Probleme und alle Einträge werden in eine Liste die Dictionaries entält gespechert. Nun dachte ich mir ich könnte einfach über die liste iterieren, dann aus jedem einzelnen Dictionary die Daten in eine Datei schreiben. Doch die Schleife wir nur 1x durchlaufen :(

Wo ist der Fehler???

show ist hierbei die Liste, die die Dictionaries enthält (zur Zeit 3 Stück) - diese werden wir auch mit print show korrekt ausgegeben...

Danke, für Eure Hilfe!

Code: Alles auswählen

    # create a 'readable' file to show on webpage
    showfile2 = file('archive.txt', 'w')
    i=0
    for entries2 in show:
        dictfromentries2 = entries2[i]
        Action = dictfromentries2['Action']
        Name = dictfromentries2['Name']
        Duration = str(dictfromentries2['Duration'])
        ti = dictfromentries2['Time issued'].strftime("%Y %m %d %H:%M")
        te = dictfromentries2['Time expire'].strftime("%Y %m %d %H:%M")
        showfile2.writelines('/' + Action + '\t' + Name + '\t\t\t' + Duration + '\t\t' + ti + '\t\t' + te + '\n')
        i=i+1
        print i
    showfile2.close()
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Ohne weitere Informationen kann man da nicht viel zu sagen.
Hast du dir mal das Tutorial auf Python.org angeschaut? Oder ein gutes deutschsprachiges (siehe wiki)? Jetzt wäre ein guter Zeitpunkt, sein Wissen zu fundieren.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

bei mir gibt der Code nur den Fehler, dass "show" nicht gefunden wird.
Crady
User
Beiträge: 18
Registriert: Freitag 31. Oktober 2008, 18:58

Naja... um den Rest vom Code hinzubekommen habe ich diverse Quellen genutzt:

- Ein ziemlich dickes Buch
- eine Video2Brain DVD
- Internetsuche mit diversesten Seiten...

leider habe ich da nichts passendes gefunden... :(

Welche Infomationen fehlen Dir noch?

dies ist der Inhalt von 'show':

Code: Alles auswählen

[[{'Action': 'ban', 'Duration': 30, 'Time issued': datetime.datetime(2008, 11, 17, 17, 18), 'Name': 'Test', 'Time expire': datetime.datetime(2008, 11, 17, 17, 48)},
 {'Action': 'unban', 'Duration': 0, 'Time expire': datetime.datetime(2008, 11, 17, 17, 20), 'Name': 'Hallo', 'Time issued': datetime.datetime(2008, 11, 17, 17, 20)},
 {'Action': 'unban', 'Duration': 0, 'Time expire': datetime.datetime(2008, 11, 17, 21, 15), 'Time issued': datetime.datetime(2008, 11, 17, 21, 15), 'Name': 'Test123'}]]
und dies ist die komplette Funktion:

Code: Alles auswählen

def externarchive():
    """ creates a new file to show on webpage """
    #open the actual file and create a empty list to be filled
    from pickle import load
    l_obj = file('picklearchive.txt','r')
    showfile = load(l_obj)
    show = [] 
        
    #create a list of Names with not expired ban
    for entries in showfile:  
        show.append(entries)
    print show        
    # create a 'readable' file to show on webpage
    showfile2 = file('archive.txt', 'w')
    i=0
    for entries2 in show:
        dictfromentries2 = entries2[i]
        Action = dictfromentries2['Action']
        Name = dictfromentries2['Name']
        Duration = str(dictfromentries2['Duration'])
        ti = dictfromentries2['Time issued'].strftime("%Y %m %d %H:%M")
        te = dictfromentries2['Time expire'].strftime("%Y %m %d %H:%M")
        showfile2.writelines('/' + Action + '\t' + Name + '\t\t\t' + Duration + '\t\t' + ti + '\t\t' + te + '\n')
        i=i+1
    showfile2.close()  
und hier noch der Inhelt der Pickledatei:

Code: Alles auswählen

(lp0
(lp1
(dp2
S'Action'
p3
S'ban'
p4
sS'Duration'
p5
I30
sS'Time expire'
p6
cdatetime
datetime
p7
(S'\x07\xd8\x0b\x11\x110\x00\x00\x00\x00'
p8
tp9
Rp10
sS'Name'
p11
S'Test'
p12
sS'Time issued'
p13
g7
(S'\x07\xd8\x0b\x11\x11\x12\x00\x00\x00\x00'
p14
tp15
Rp16
sa(dp17
S'Action'
p18
S'unban'
p19
sS'Duration'
p20
I0
sS'Name'
p21
S'Hallo'
p22
sS'Time issued'
p23
g7
(S'\x07\xd8\x0b\x11\x11\x14\x00\x00\x00\x00'
p24
tp25
Rp26
sS'Time expire'
p27
g7
(S'\x07\xd8\x0b\x11\x11\x14\x00\x00\x00\x00'
p28
tp29
Rp30
sa(dp31
S'Action'
p32
S'unban'
p33
sS'Duration'
p34
I0
sS'Time issued'
p35
g7
(S'\x07\xd8\x0b\x11\x15\x0f\x00\x00\x00\x00'
p36
tp37
Rp38
sS'Name'
p39
S'Test123'
p40
sS'Time expire'
p41
g7
(S'\x07\xd8\x0b\x11\x15\x0f\x00\x00\x00\x00'
p42
tp43
Rp44
saa.
Zuletzt geändert von Crady am Montag 17. November 2008, 23:02, insgesamt 1-mal geändert.
acoolon
User
Beiträge: 27
Registriert: Samstag 2. August 2008, 20:16

ersteinmal stimme ich str1442 da zu, doch versuche ich mal zu raten ;)

show ist eine Liste mit Dictionarys, sagtest du...
was soll dann "dictfromentries2 = entries2" machen?

wenn ich es richtig verstanden habe dann solltest du aus obengenanntem einfach mal "dictfromentries2 = entries2" machen..bei mir ging dann...

Code: Alles auswählen

show =  [{'1':'A','2':'B','3':'C'},{'1':'D','2':'E','3':'F'},{'1':'G','2':'H','3':'I'}]

for entries2 in show:
	dictfromentries2 = entries2
        Action = dictfromentries2['1']
        Name = dictfromentries2['2']
        Duration = str(dictfromentries2['3'])
        #ti = dictfromentries2['Time issued'].strftime("%Y %m %d %H:%M")
        #te = dictfromentries2['Time expire'].strftime("%Y %m %d %H:%M")
        print Action,Name,Duration
kommt dann das raus:

Code: Alles auswählen

acoolon@kiste:~/Desktop$ python bla.py
A B C
D E F
G H I
mfg
EDIT: Fehler im System? ich konnte nur den ersten Beitrag sehen..biss ich meinen abgeschickt hatte...

EDIT2: Dein show hat nur ein Element, eine Liste mit Dicts..d.h. nur eine Iteration..
Crady
User
Beiträge: 18
Registriert: Freitag 31. Oktober 2008, 18:58

oops...

sorry, ja hatte noch mal geändert wahrscheinlich während Du geschriebn hast...

Aber nun sehe ich auch die beinden Eckigen Listenklammern... mist! Da muss ich mal sehen, wie ich das hinbekomme...
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Du hast da doch zwei verschachtelte Listen! Bei der Forschleife greifst du auf die Erste zu, mit der Zählvariable greift du auf das erste Unterelement zu. Nächster Durchlauf -> Äußere Liste hatte bloß ein Element (nämlich die innere Liste), Liste zuende, gut ist.

Bevor du aber sowas zusammenbaust, schau dir wirklich das offizielle Tutorial an und vergiß das Buch und die DVD erstmal ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Crady hat geschrieben:Ich möchte ein mit Pickle erzeugtes file in ein "lesbares" Format speichern um es auf einer Webseite anzuzeigen.
Würde es nicht reichen in JSON zu serialisieren? Python hat bereits entsprechende Libraries dabei, die das machen und JSON ist "lesbar".
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
acoolon
User
Beiträge: 27
Registriert: Samstag 2. August 2008, 20:16

hinbekommst du das, indem du das hier

Code: Alles auswählen

   
show = []

 #create a list of Names with not expired ban
    for entries in showfile: 
        show.append(entries) 
wegmachst und showfile in show oder show in showfile umbenennst...denke ich
Crady
User
Beiträge: 18
Registriert: Freitag 31. Oktober 2008, 18:58

@acoolon:

fast... dann muss ich noch:

Code: Alles auswählen

# create a 'readable' file to show on webpage
    showfile2 = file('actual.txt', 'w')
    for entries2 in showfile[0]:
        Action = entries2['Action']
        Name = entries2['Name']
        Duration = str(entries2['Duration'])
        ti = entries2['Time issued'].strftime("%Y %m %d %H:%M")
        te = entries2['Time expire'].strftime("%Y %m %d %H:%M")
        showfile2.writelines('/' + Action + '\t\t' + Name + '\t\t\t' + Duration + '\t\t' + ti + '\t\t' + te + '\n')     
    showfile2.close()
machen... Der Eintrag, den Du meinst ist vollkommen überflüssig...

@Leonidas:

json hört sich interessant an... aber so wie ich das gesehen habe ist der nur ab 2.6 integriert, oder??

Da ich mit viel mit der Lib "pyinsim" arbeite habe ich noch 2.5.2 ...
Benutzeravatar
veers
User
Beiträge: 1219
Registriert: Mittwoch 28. Februar 2007, 20:01
Wohnort: Zürich (CH)
Kontaktdaten:

Für 2.5 kannst du simplejson verwenden. Ist exakt die selbe Library ;)
[url=http://29a.ch/]My Website - 29a.ch[/url]
"If privacy is outlawed, only outlaws will have privacy." - Phil Zimmermann
Crady
User
Beiträge: 18
Registriert: Freitag 31. Oktober 2008, 18:58

Vielen Dank!

das werde ich mir mal ansehen :)
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Code: Alles auswählen

sys.version
'2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)]'

Code: Alles auswählen

import json
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ImportError: No module named json
import simplejson
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ImportError: No module named simplejson
http://www.python.org/doc/2.6/library/json.html

Kann es sein, das json erst ab 2.6 mit an Board ist, ich kann es bei mir jedenfalls nicht finden.

Es klingt aber interessant. Danke für den Tip!
Gruß!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

C4S3 hat geschrieben:Kann es sein, das json erst ab 2.6 mit an Board ist, ich kann es bei mir jedenfalls nicht finden.
Ja, wurde doch in dem Thread geschrieben. Und dass man für Python 2.5 simplejson verwenden kann.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Danke, ich hatte das falsch interpretiert.
Für 2.5 kannst du simplejson verwenden. Ist exakt die selbe Library
Ich dachte schon, die Library wäre auch bei den Batterien dabei. ;)

Sorry für das Missverständnis.
Gruß!
Antworten