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

Bzip bereits während des Downloads

Beitragvon echasslau » 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

Beitragvon birkenfeld » 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

Beitragvon echasslau » 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:

Beitragvon nkoehring » 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.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder