Seite 1 von 1

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

Verfasst: Montag 17. November 2008, 22:32
von Crady
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()

Verfasst: Montag 17. November 2008, 22:50
von str1442
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.

Verfasst: Montag 17. November 2008, 22:53
von audax
bei mir gibt der Code nur den Fehler, dass "show" nicht gefunden wird.

Verfasst: Montag 17. November 2008, 22:59
von Crady
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.

Verfasst: Montag 17. November 2008, 23:00
von acoolon
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..

Verfasst: Montag 17. November 2008, 23:08
von Crady
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...

Verfasst: Montag 17. November 2008, 23:09
von str1442
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 ;)

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

Verfasst: Montag 17. November 2008, 23:11
von Leonidas
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".

Verfasst: Montag 17. November 2008, 23:16
von acoolon
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

Verfasst: Montag 17. November 2008, 23:41
von Crady
@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 ...

Verfasst: Dienstag 18. November 2008, 00:04
von veers
Für 2.5 kannst du simplejson verwenden. Ist exakt die selbe Library ;)

Verfasst: Dienstag 18. November 2008, 01:32
von Crady
Vielen Dank!

das werde ich mir mal ansehen :)

Verfasst: Dienstag 18. November 2008, 09:59
von C4S3

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!

Verfasst: Dienstag 18. November 2008, 10:03
von Leonidas
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.

Verfasst: Dienstag 18. November 2008, 10:30
von C4S3
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.