Seite 1 von 1
urllib2: bei einem .read den Fortschritt anzeigen
Verfasst: Donnerstag 24. April 2008, 09:32
von JonnyGuitar
Moin zusammen,
ich habe folgendes Problem, und zwar lade ich mit folgenden Befehlen ein Dokument aus dem Netz auf den Rechner:
Code: Alles auswählen
.
.
req = urllib2.Request(self.server, data, headers)
.
handle = urllib2.urlopen(req)
return = handle.read()
ich weiss, dass ich mit
die Gesamtgrösse des Dokuments herauskriege.
Hat einer eine Idee wie ich während dem .read Statusmeldungen
zurückbekommen könnte um den Fortschritt auszurechnen und in
einer Progressbar darstellen könnte?
Vielen Dank für eure Hilfe.
mfg Jonny
Verfasst: Donnerstag 24. April 2008, 09:58
von dennda
Du hast die Content-Length und read() aktzeptiert hier ein Argument.
Siehe:
Help on built-in function read:
read(...)
read([size]) -> read at most size bytes, returned as a string.
If the size argument is negative or omitted, read until EOF is reached.
Notice that when in non-blocking mode, less data than what was requested
may be returned, even if no size parameter was given.
Lies einfach in einer Schleife immer einen Happen ein, also eine bestimmte Anzahl Bytes und bei jedem Schritt aktualisierst du deinen Fortschrittsbalken.
Ich hab das selbst mal gemacht, aber ich hab den Code grade nicht hier.
//edit: Übrigens *muss* bei deinem Request die Content-Length nicht mitgegeben werden. Das solltest du noch überprüfen. Der Stream könnte auch 'chunked' kommen o.ä.
grüße
Verfasst: Donnerstag 24. April 2008, 10:34
von Y0Gi
Ich habe mal
sowas für FTP gemacht. Das bringt dich hoffentlich auf den richtigen Weg.
Verfasst: Donnerstag 24. April 2008, 10:57
von audax
Gnah...ich glaube ich bau dafür mal ne Subclass von socket.Socket.
Ich brauch das demnächst nämlich auch

Verfasst: Donnerstag 24. April 2008, 12:28
von JonnyGuitar
Erstmal vielen Dank für eure Hilfe.
Jetzt taucht folgendes Problem auf: Ich habe folgende Stelle
durch
Code: Alles auswählen
while True:
data = handle.read(8192)
if not data:
break
ersetzt. Nur steht in data nichts mehr drin und er springt direkt auf break.
Ersetze ich das Ganze wieder durch den alten Code geht das ganze wieder.
Was mache ich falsch?
Verfasst: Donnerstag 24. April 2008, 12:47
von BlackJack
Überleg Dir mal genau was in der Schleife passiert, insbesondere was die Abbruchbedingung ist und welchen Wert `data` nach der Schleife deswegen *immer* haben *muss*. Ein ``print data`` vor dem ``if`` bringt vielleicht etwas Licht in die Sache.
Verfasst: Montag 28. April 2008, 09:18
von JonnyGuitar
Guten Morgen,
nachdem ich jetzt das ganze Wochenende davor gesessen habe und immer noch zu keiner Lösung gekommen bin möchte ich hier nochmal nachfragen. Ich habe mir data ausgeben lassen, dieses ist immer leer. Aber ich lese doch vorher was in diese Variable ein. Vielleicht hat einer noch ein Denkanstoss für mich, habe momentan voll das Brett vorm Kopf.
mfg Jonny
Verfasst: Montag 28. April 2008, 09:25
von BlackJack
`data` ist nicht *immer* leer sondern nur nach der Schleife. Das muss es ja aber auch, weil genau dass die Bedingung ist, bei der die Schleife überhaupt abbricht. Denn solange `data` etwas enthält ist der Code in der Schleife.
Du liest zwar etwas in die Variable ein, aber im nächsten Schleifendurchlauf wird der Name wieder an andere Daten gebunden. Hier würdest Du ja auch nicht erwarten, dass "Hallo" ausgegeben wird, nur weil das irgend wann einmal an `text` gebunden war: