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

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:

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

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:

zeig mal deinen xml einlese code :)

gruss
patrickk

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk

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

Patrick
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
patrickk

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk

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

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
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

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.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
patrickk

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
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Du kannst allerdings auch einfach den String in irgendeinen Zeichensatz konvertieren, falls es wirklich daran liegt.

Ich hatte mal ein "Test" Skript geschrieben, mit dem ich alle Zeichensätzte einfach durchprobiere: http://www.python-forum.de/viewtopic.php?p=20637#20637

Du könntest es leicht erweitern, das dein base64 encoding direkt mit getestet wird...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

patrickk hat geschrieben:9m??;(M?i*?hv?sM?4?A?
L??m???y/r?9?4\nd7Y
Also bei den ganzen Fragen die du hier im Forum stellst, verstehe ich genau so etwas. :? Du kommst immer wieder mit neuen Sachen, man weiß nicht was du machen willst, wie und warum auch nicht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

patrickk hat geschrieben: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?
Kann es sein, dass Du bisher noch nicht erwähntest das Du die Daten per XMP-RPC bekommst? Kann es sein Du mal die Dokumentation für xmlrpclib.Binary lesen solltest?

Kleiner Test:

Code: Alles auswählen

In [91]: a = xmlrpclib.Binary('Hallo\xff')

In [92]: str(a)
Out[92]: 'Hallo\xff'
Siehe da, man bekommt von solchen Objekten die Binärdaten als solche und nicht in der Form, wie sie im XML übertragen wurden.
Antworten