Bzip bereits während des Downloads

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
echasslau
User
Beiträge: 4
Registriert: Sonntag 23. September 2007, 14:30

Sonntag 23. September 2007, 14:36

Hallo Leute.

Ich möchte gern eine bzip-Datei während des Downloads entpacken. Ich habe das versucht über urlopen und decompress zu machen, aber ich erhalte immer einen Fehler:

Code: Alles auswählen

ValueError: couldn't find end of stream
Ich tippe einfach mal, dass das an der "Blockbildung" der BZip-Kompession liegt, aber sicher bin ich da nicht...

Mein Lösungsansatz war in etwa so:

Code: Alles auswählen

#!/usr/bin/python

from urllib import urlopen
from bz2 import decompress

class BZ2FileDownload(object):
    def __init__(self, name):
        self.fileobject = urlopen(name)
        self.name = name
    
    def read(self, size=None):
        buf = ""
        buf = self.fileobject.read(size)
        buf = decompress(buf)
        return buf
Hat irgendwer eine Idee, wie man das zum Laufen bekommt?

Gruß, Andreas
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Sonntag 23. September 2007, 14:42

Du darfst nur ein einziges Decompressor-Objekt nehmen, das du dann immer mit den gelesenen Daten "fütterst":

Code: Alles auswählen

#!/usr/bin/python

from urllib import urlopen
import bz2

class BZ2FileDownload(object):
    def __init__(self, name):
        self.fileobject = urlopen(name)
        self.decomp = bz2.BZ2Decompressor()
        self.name = name
   
    def read(self, size=None):
        buf = self.fileobject.read(size)
        return self.decomp.decompress(buf)
Dabei muss man beachten, dass read() natürlich nicht immer gleichviel zurückliefert. Auch mit dem end-of-stream muss man aufpassen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
echasslau
User
Beiträge: 4
Registriert: Sonntag 23. September 2007, 14:30

Sonntag 23. September 2007, 15:46

Klar logisch, danke jetzt kommt erstmal kein Fehler mehr, aber funktionieren tut das noch nicht richtig...
Jetzt erhalte ich sowas:

Code: Alles auswählen

>>> WERT=BZ2FileDownload(...)
>>> print WERT.read(100)

>>> print '%s' % WERT.read(100)
¬÷¹ëƒY&SY:B®¶ŽÜßÿv1ÿÿÿ¿ÿÿÿ¿ÿÿÿÿÿÿÿÿÿÿŸ¿ïøþe"ÿ7¹¼§%°³ãÆ/GßmÞö4•ÒóÓ½Ýàõ {åÔJ‹'¼>bØÕ
EDIT: Der entpackte Inhalt sollte eigentlich eine simple XML-Datei sein...
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Montag 24. September 2007, 08:49

Ja nun geht es wohl darum, die Blockgroessen zu beachten. Du kannst quasi immer nur einen Block als ganzes entpacken...
Außerdem ist dann da noch der Header des Archivs, den du extra beachten musst.
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Antworten