Si j'ai une URL qui, lorsqu'elle est soumise dans un navigateur Web, fait apparaître une boîte de dialogue pour enregistrer un fichier Zip, comment puis-je récupérer et télécharger ce fichier Zip en Python?
Utilisez urllib2.urlopen
. La valeur de retour est un objet de type fichier que vous pouvez read()
, transmettre à zipfile
et ainsi de suite.
Pour autant que je sache, la bonne façon de procéder est la suivante:
import requests, zipfile, StringIO
r = requests.get(Zip_file_url, stream=True)
z = zipfile.ZipFile(StringIO.StringIO(r.content))
z.extractall()
vous voudrez bien sûr vérifier que GET a réussi avec r.ok
.
Pour Python 3+, insérez le module StringIO dans le module io et utilisez BytesIO au lieu de StringIO: Ici sont des notes de publication mentionnant ce changement.
import requests, zipfile, io
r = requests.get(Zip_file_url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
Avec l’aide de cet article de blog , je l’utilise avec juste requests
. Le point étrange de la chose stream
étrange est qu’il n’est pas nécessaire d’appeler content
pour les demandes volumineuses, ce qui nécessiterait que tout soit traité en même temps, ce qui encombrerait la mémoire. La stream
évite cela en parcourant les données un bloc à la fois.
url = 'https://www2.census.gov/geo/tiger/GENZ2017/shp/cb_2017_02_tract_500k.Zip'
target_path = 'alaska.Zip'
response = requests.get(url, stream=True)
handle = open(target_path, "wb")
for chunk in response.iter_content(chunk_size=512):
if chunk: # filter out keep-alive new chunks
handle.write(chunk)
handle.close()
Voici ce que je dois travailler dans Python 3:
import zipfile, urllib.request, shutil
url = 'http://www....myzipfile.Zip'
file_name = 'myzip.Zip'
with urllib.request.urlopen(url) as response, open(file_name, 'wb') as out_file:
shutil.copyfileobj(response, out_file)
with zipfile.ZipFile(file_name) as zf:
zf.extractall()
Utilisez urllib2.urlopen ou essayez d’utiliser l’excellent module Requests
et évitez les maux de tête urllib2:
import requests
results = requests.get('url')
#pass results.content onto secondary processing...
Merci à @yoavram pour la solution ci-dessus, mon chemin d’URL lié à un folder compressé, et rencontre une erreur de BADZipfile (le fichier n’est pas un fichier Zip), et c’était étrange de l’essayer plusieurs fois récupérer l'URL et le décompresser tout d'un coup donc je modifie un peu la solution bit. en utilisant la méthode is_zipfile selon ici
r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
while not check:
r = requests.get(url, stream =True)
check = zipfile.is_zipfile(io.BytesIO(r.content))
else:
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()