Seite 1 von 1

Downloadfunktion

Verfasst: Samstag 2. August 2008, 20:13
von dodo47
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

Verfasst: Samstag 2. August 2008, 21:59
von Trundle
Du weißt schon, dass es ``urllib.urlretrieve`` gibt?

Verfasst: Samstag 2. August 2008, 21:59
von dodo47
ja aba wie komme ich da an die download geschwindigkeit ran?

Verfasst: Samstag 2. August 2008, 22:06
von Trundle
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.

Verfasst: Sonntag 3. August 2008, 12:41
von Darii
Was machst du eigentlich wenn jemand kein callback angibt? Wenn man schon Standardwerte für Argumente angibt sollten sie auch sinnvoll sein.

Verfasst: Sonntag 3. August 2008, 14:13
von dodo47
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