Seite 1 von 1

Bzip bereits während des Downloads

Verfasst: Sonntag 23. September 2007, 14:36
von echasslau
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

Verfasst: Sonntag 23. September 2007, 14:42
von birkenfeld
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.

Verfasst: Sonntag 23. September 2007, 15:46
von echasslau
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...

Verfasst: Montag 24. September 2007, 08:49
von nkoehring
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.