télécharger un fichier zip sur un lecteur local et extraire tous les fichiers vers un dossier de destination en utilisant python 2.5

j'essaie de télécharger un fichier zip sur un lecteur local et d'extraire tous les fichiers vers un dossier de destination.

donc j'ai trouvé une solution mais c'est seulement pour" télécharger " un fichier d'un répertoire vers un autre répertoire mais ça ne marche pas pour télécharger des fichiers. pour l'extraction, je suis capable de le faire fonctionner en 2.6 mais pas pour 2.5. donc, toutes les suggestions pour le travail autour ou une autre approche, je suis certainement ouvert à. merci à l'avance.

######################################
'''this part works but it is not good for URl links''' 
import shutil

sourceFile = r"C:Usersbluemanmastertest2.5.zip"
destDir = r"C:Usersbluemanuser"
shutil.copy(sourceFile, destDir)
print "file copied"
######################################################

'''extract works but not good for version 2.5'''
import zipfile

GLBzipFilePath =r'C:Usersbluemanusertest2.5.zip'
GLBextractDir =r'C:Usersbluemanuser'

def extract(zipFilePath, extractDir):
 zip = zipfile(zipFilePath)
 zip.extractall(path=extractDir)
 print "it works"

extract(GLBzipFilePath,GLBextractDir)

######################################################
2
demandé sur Alvin Row 2009-11-21 06:44:57

3 réponses

urllib.urlretrieve peut obtenir un fichier (zip ou autre;-) à partir d'une URL vers un chemin donné.

extractall est en effet le nouveau 2.6, mais en 2.5, vous pouvez utiliser explicitement la boucle (obtenir tous les noms, ouverte chaque nom, etc). Vous avez besoin d'un exemple de code?

donc voici l'idée générale (a besoin de plus try / except si vous voulez donner un message d'erreur agréable dans chaque cas qui pourrait aller mal, dont, bien sûr, il sont un million de variantes -- Je n'utilise que deux de ces cas comme exemples...):

import os
import urllib
import zipfile

def getunzipped(theurl, thedir):
  name = os.path.join(thedir, 'temp.zip')
  try:
    name, hdrs = urllib.urlretrieve(theurl, name)
  except IOError, e:
    print "Can't retrieve %r to %r: %s" % (theurl, thedir, e)
    return
  try:
    z = zipfile.ZipFile(name)
  except zipfile.error, e:
    print "Bad zipfile (from %r): %s" % (theurl, e)
    return
  for n in z.namelist():
    dest = os.path.join(thedir, n)
    destdir = os.path.dirname(dest)
    if not os.path.isdir(destdir):
      os.makedirs(destdir)
    data = z.read(n)
    f = open(dest, 'w')
    f.write(data)
    f.close()
  z.close()
  os.unlink(name)
13
répondu Alex Martelli 2009-11-22 00:13:31

pour le téléchargement, voir urllib:

import urllib
webFile = urllib.urlopen(url)

pour la décompression, utiliser zipfile . Voir aussi cet exemple .

2
répondu Mark Byers 2009-11-21 03:54:26

le plus court chemin que j'ai trouvé jusqu'à présent, est d'utiliser +alex réponse, mais avec ZipFile.extractall () au lieu de la boucle:

from zipfile import ZipFile
from urllib import urlretrieve
from tempfile import mktemp

filename = mktemp('.zip')
destDir = mktemp()
theurl = 'http://www.example.com/file.zip'
name, hdrs = urlretrieve(theurl, filename)
thefile=ZipFile(filename)
thefile.extractall(destDir)
thefile.close()
2
répondu Ohad Cohen 2017-07-26 14:30:08