Downloadfunktion

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
dodo47
User
Beiträge: 5
Registriert: Dienstag 12. Dezember 2006, 15:34

Guten Abend,
ich habe folgende kleine Funktion geschrieben um den Inhalt einer URL in eine Datei zu schreiben.
Meine Downloadfunktion gibt die Werte die Größe der Datei, den bereits runter geladenen Teil und die Geschwindigkeit an eine Callbackfuntion weiter.

Hier ist die Funktion:

Code: Alles auswählen

import time,urllib
def download(url, fd, callback = False):
	urlobj = urllib.urlopen(url)
	chunksize = 1000
	try:
		size = int(urlobj.info().getheader('content-length'))
	except:
		size = False	
	ready = False
	downloaded = 0
	
	while(not ready):
		time1 = time.time()	
		chunk = urlobj.read(chunksize)
		fd.write(chunk)
		time2 = time.time()
		diff = time2 -time1
		downloaded += chunksize
		speed = chunksize / diff
		callback(size, downloaded, speed)
		if chunk =='':
			ready = True
Nun habe ich einen Frage:
Wie sollte der Wert der Variable chunksize gewählt werden?
(also die Größe des Stückes welches in der Schleife runtergeladen wird)
Gruß dodo47
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Du weißt schon, dass es ``urllib.urlretrieve`` gibt?
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
dodo47
User
Beiträge: 5
Registriert: Dienstag 12. Dezember 2006, 15:34

ja aba wie komme ich da an die download geschwindigkeit ran?
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Indem die Funktion/das Callable, die als``reporthook``-Argument übergeben wird, sich überlegt, wieviel Zeit vergangen ist. Wieviel bereits heruntergeladen ist, bekommt sie/es übergeben und dann eben ein wenig rumrechnen. Sollte man eigentlich drauf kommen.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Was machst du eigentlich wenn jemand kein callback angibt? Wenn man schon Standardwerte für Argumente angibt sollten sie auch sinnvoll sein.
dodo47
User
Beiträge: 5
Registriert: Dienstag 12. Dezember 2006, 15:34

Trundle hat geschrieben: Sollte man eigentlich drauf kommen.
Hab ich wohl überlesen. Vielen Dank für den Hinweis.
Hab es jetzt mit einer Download Klasse gelöst.
Hier der Code:

Code: Alles auswählen

class Download:
	'''Interface for urllib.urlretrieve.
	The callback function will be passed three arguments;
	the total size of the file, the number of downloaded bytes
	and the download rate in kbytes/second.'''
	def __init__(self, url, file, callback):
		self.callback = callback
		self.time_before = time.time()
		self.count_before = 0
		self.return_tuple = urllib.urlretrieve(url, file, self.internal_cb)

	def internal_cb(self, count, blocksize, filesize):
		'''Only for internal use.'''
		time_after = time.time()
		time_diff = time_after - self.time_before
		count_diff = count - self.count_before
		speed = (count_diff*blocksize)/time_diff
		self.callback(filesize, (count*blocksize), (speed/1000))
		self.count_before = count
		self.time_before = time_after
	
	def get_return_tuple(self):
		'''Returns the tuple that urlretrieve returns.'''
		return self.return_tuple
Darii hat geschrieben: Was machst du eigentlich wenn jemand kein callback angibt? Wenn man schon Standardwerte für Argumente angibt sollten sie auch sinnvoll sein.
Recht hast du. Hab jetzt den Standartwert weggelassen.
Wenn jemand nicht an der Downloadrate interessiert ist kann er auch direkt urlretrieve benutzen.
Gruß dodo47
Antworten