Je télécharge un fichier en utilisant Python urllib2. Comment vérifier la taille du fichier?

StackOverflow https://stackoverflow.com/questions/1636637

  •  06-07-2019
  •  | 
  •  

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()
Était-ce utile?

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'))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top