pickle.dump

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.
patrickk

Dienstag 16. August 2005, 11:17

Hallo,

ich bekomme 5 streams in base64. Mit ethereal sieht es so aus:
IB45bffxyGk7KE3uiehpke9aptPn67CbHGbrQNay3BxGy8tu0Ll8LrtBRHl5Ti67QeW0+1ye08tsNp33IqftPhCxLAct3266/M1mh+vz+RhdBw==
Die == hinten sehen klar nach base64 aus. Wenn ich mit pickle.dump die datei speichere und auf die daten zugreife sieht es so aus:
\x1e9m\xf7\xf1\xc8i;(M\xee\x89\xe8i\x91o\x19f\xb3\xc3\xa0{y\

wie kann ich das in die obige Form bringen, oder koennten durch pickle.dump probleme aufgetaucht sein (UTF-8... falsche Zeichen...)

Wenn jemand etwas besseres als pickle.dump weiss, dann bitte bescheid geben.
Ich kann auf ein XML Dokument zugreifen und bekomme <base64>IB45...</base64>
Ich moechte einfach nur den Inhalt. Aber mit pickle dump sieht es anders aus.
Speichern will ich die Dateien auch nicht, da ich 5 zusammensetzen muss. Das Endergebnis moechte ich lieber speichern.

Code: Alles auswählen

def parse(file):
 #extracts RAW Data out of file
 i=0
 while i <= 6 :
   i+=1  
   data= file.readline()
 data=data[2 :]
 data=data[: -2]
 return data
hiermit habe ich aus der Datei die Daten geholt.
So etwas liefert opickle.dump:

Code: Alles auswählen

(ixmlrpclib
Binary
p0
(dp1
S'data'
p2
S' \x1e9m\xf7\xf1\xc8i;(M\xee\x89\xe8i\x91o\x19f\xb3\xc3\xa0{y\x8c\x9e\x97\xd9t\x90\xbe\x0eb\xbe\xe5a7\xbd\xb5d\xd7\xc5\xbc\x179m\xf7\x81\xa8\xa6\x11\xde<\xde\xc9\xd7\xe5\xb4\x0e\xb4\x0c\xb7\xcb\xf2\xba\xbb,\x07\xd5\xdd\xf4\xb2|>F\xcb\xcbi1\x1d$\x06'
p3
sb.
Und so in die Datei geschrieben:

Code: Alles auswählen

f = file('/home/name/'+curtime+' workfile'+str(i),'wt')
      #pickle.dump(daten, f)
Patrick
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 16. August 2005, 11:42

wieso speicherst du das mit pickle? sind ja raw daten, kannst du einfach mit

Code: Alles auswählen

f = open('lala','wb')
f.write(daten)
f.close()
speichern
patrickk

Dienstag 16. August 2005, 12:01

Hi,

am liebsten wuerde ich es nicht speichern, sondern irgendwie an z.B. data=daten geben, damit ich es ditrekt bearbeiten kann. Wie macht man das, wenn daten nicht direkt die daten sind, sondern XML: <base64>debfwehowe</base64>


Danke,


Patrick
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Dienstag 16. August 2005, 12:05

zeig mal deinen xml einlese code :)

gruss
patrickk

Dienstag 16. August 2005, 12:16

Hallo,

der Code sollte so aussehen:

<base64>IB45...</base64>

dies ist ein Auszug aus ethereal... Die Daten werden empfangen. Somit kann ich leider keine Datei zeigen... Aber es sollte nur dies drinn stehen. Da es auch pagetlength... oder so gibt. Wenn man darauf zugreift wird direkt der wert angezeigt:
<struct>
<member>
<name>pagelength</name>
<value><int>82</int></value></member>
<member>
<name>pagecontents</name>
<value><base64>87LbBwgXhiUJvbj1xSeBg==</base64></value></member></struct>
Wie gesagt, auf pagelength kann ich direkt zugreifen, somit muss nur irgendwie base entschluesslet werden...?

Patrick
patrickk

Dienstag 16. August 2005, 12:21

Hallo,

f.write beendet die Schleife hne etwaszu machen. Das liegt bestimmt an den <base64>+daten...
aber am liebsten wuerde ich auch direkt an die daten ohne zu speichern. pickle dumb verwendet auch eine andere Darstellung fuer den inhalt. Das kann leider probleme mit den zeichen geben...
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 16. August 2005, 13:12

Ich verstehe das Problem nicht so ganz, wieso kannst du nicht einfach die RAW-base64 Daten aus dem XML herraus trennen und mit dem base64 Modul verarbeiten???
Also quasi:

Code: Alles auswählen

print base64.decodestring(base64_string)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk

Dienstag 16. August 2005, 13:44

Wie trenne ich denn die daten aus dem xml dokument?
das ist mein problem?
ab da unktioniert jetzt alles...

Patrick
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 16. August 2005, 15:16

Das ist doch gar kein Problem:

sniff.xml

Code: Alles auswählen

<struct>
<member>
<name>pagelength</name>
<value><int>82</int></value></member>
<member>
<name>pagecontents</name>
<value><base64>87LbBwgXhiUJvbj1xSeBg==</base64></value></member></struct>

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import re
rex = re.compile(r'(?<=\<base64>).*(?=</base64>)')

f = file('sniff.xml', 'r')
base64data = ''
for line in f:
    result = rex.findall(line)
    if result:
        base64data = result[0]

print base64data

f.close()
Vielleicht wird jetzt ProgChild meckern, dass ich keinen XML-Parser verwendet habe, aber einen SAX ContentHandler zu schreiben war mir im Moment zu aufwendig. Das kannst du, patrikk machen wenn du Lust hast und dir diese Lösung nicht reicht, wie du ContentHandler nutzt siehst du hier.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
patrickk

Dienstag 16. August 2005, 15:33

Hi,

danke fuer die Hilfe. Sorry habe etwas vergessen:

pagaData = listPages["pagecontents"]

Das ist was ich meinte mit pagadata zeigt schon auf <base64>..</base64>
Wie komme ich da an die daten ran. Direkt ohne zu speichern. Also kein load f...
ich habe pagadata und will an die daten.

Wenn ich mit pickle.dump speicher und lade, dann sind bei str(data) die Daten schon dekodiert (von base64), aber ich will ohne zu speichern an die daten...
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 16. August 2005, 15:36

Ich verstehe nur Bahnhof...

Also listPages["pagecontents"] bzw. pageData ist, wie im Obrigen beispiel ein String mit dem Inhalt "87LbBwgXhiUJvbj1xSeBg==" ???
Was geht hierbei dann nicht:

Code: Alles auswählen

pagaData = listPages[i]["pagecontents"]
print base64.decodestring(pagaData)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk

Dienstag 16. August 2005, 16:02

Hallo, ehrlich gesagt verstehe ich auch nicht, wieso es so nicht klappt? Wenn ich text= str(pagaData) und dann print (text) schreibe erscheint:
9m??;(M?i*?hv?sM?4?A?
L??m???y/r?9?4\nd7Y
ok, die ausgabe sieht nicht richtig aus, aber so sollte base64 als string aussehen... und dann gebe ich text and decode('base64'). Leider kann ich keine Fehlermeldungen sehen...
Es beedndet aber genau dort die schleife?
patrickk

Dienstag 16. August 2005, 16:08

Wenn ich statt str(pagadata), repr(pagadata) und dann print.. waehle erscheint:
<xmlrpclib.Binary instance at 0x4041692c>
Kann es irgendwie sein, dass man bei soetwas str() und print machen kann, aber es nach str(pagadata), doch kein richtiger string ist, den man an base64dec geben kann?
Benutzeravatar
jens
Moderator
Beiträge: 8482
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Dienstag 16. August 2005, 16:22

Hm. Vielleicht sind die base64 Daten einfach nicht wirklich ein base64 String?

Jedenfalls funktioniert das bei mir nicht:

Code: Alles auswählen

import base64

pageData = "87LbBwgXhiUJvbj1xSeBg=="
print base64.decodestring( pageData )
Liefert einen "Incorrect padding"-Fehler...

Teste doch erstmal per Hand den base64-String zu decodieren.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk

Dienstag 16. August 2005, 16:30

Hallo,


das sollte alles funktionieren. Ich habe mit pickle.dump eine Datei erzeuge. Damit kann ich alles machen. Ich habe hier fuer den code den text gekuerzt, da er lang ist. aber eine Idee haette ich. Vielleicht ist der text z.B. in utf-8. Dann macht str bestimmt etwas anderes daraus und dadurch koennen Zeichen fehlen. Dann klappt base64 decode nat. nicht.

Kann ich mit pickle.dump auch eine temp Datei erzeugen, die nicht gespeichert wird?
test=pickle.load(f)
test2 = str(test)
base64dec(test2)
so funktioniert es...

ist nur bloede, da ich 5 nachrichten bekomme und die gerne zusammen speichern wuerde
Antworten