Je télécharge un fichier en utilisant Python urllib2. Comment vérifier la taille du fichier?
Question
Et s'il est volumineux ... alors arrêtez le téléchargement? Je ne souhaite pas télécharger de fichiers de plus de 12 Mo.
request = urllib2.Request(ep_url)
request.add_header('User-Agent',random.choice(agents))
thefile = urllib2.urlopen(request).read()
La solution
Inutile de le faire, bobince , puis de passer à httplib. Vous pouvez faire tout cela avec urllib directement:
>>> import urllib2
>>> f = urllib2.urlopen("http://dalkescientific.com")
>>> f.headers.items()
[('content-length', '7535'), ('accept-ranges', 'bytes'), ('server', 'Apache/2.2.14'),
('last-modified', 'Sun, 09 Mar 2008 00:27:43 GMT'), ('connection', 'close'),
('etag', '"19fa87-1d6f-447f627da7dc0"'), ('date', 'Wed, 28 Oct 2009 19:59:10 GMT'),
('content-type', 'text/html')]
>>> f.headers["Content-Length"]
'7535'
>>>
Si vous utilisez httplib, vous devrez peut-être implémenter la gestion des redirections, la prise en charge des proxy et les autres fonctionnalités intéressantes que urllib2 effectue pour vous.
Autres conseils
Vous pourriez dire:
maxlength= 12*1024*1024
thefile= urllib2.urlopen(request).read(maxlength+1)
if len(thefile)==maxlength+1:
raise ThrowToysOutOfPramException()
mais vous avez bien sûr lu 12 Mo de données non désirées. Si vous souhaitez minimiser le risque que cela se produise, vous pouvez vérifier l'en-tête HTTP Content-Length, s'il est présent (il se peut que ce ne soit pas le cas). Mais pour cela, vous devez vous reporter à httplib à la place de l'urllib plus général.
u= urlparse.urlparse(ep_url)
cn= httplib.HTTPConnection(u.netloc)
cn.request('GET', u.path, headers= {'User-Agent': ua})
r= cn.getresponse()
try:
l= int(r.getheader('Content-Length', '0'))
except ValueError:
l= 0
if l>maxlength:
raise IAmCrossException()
thefile= r.read(maxlength+1)
if len(thefile)==maxlength+1:
raise IAmStillCrossException()
Vous pouvez vérifier la longueur avant de demander à obtenir le fichier également, si vous préférez. C'est en gros la même chose que ci-dessus, sauf que vous utilisez la méthode 'HEAD'
au lieu de 'GET'
.
vous pouvez d'abord vérifier la longueur du contenu dans une demande HEAD, mais attention, cet en-tête n'a pas à être défini - voir Comment envoyer une demande HEAD HTTP dans Python 2?
Ceci fonctionnera si l'en-tête Content-Length est défini
import urllib2
req = urllib2.urlopen("http://example.com/file.zip")
total_size = int(req.info().getheader('Content-Length'))