2009-11-21 5 views
2

J'essaie de télécharger un fichier zip sur un disque local et d'extraire tous les fichiers dans un dossier de destination. J'ai donc trouvé une solution, mais c'est seulement pour "télécharger" un fichier d'un répertoire vers un autre répertoire, mais cela ne fonctionne pas pour le téléchargement de fichiers. pour l'extraction, je suis capable de l'obtenir en 2.6 mais pas en 2.5. donc des suggestions pour le travail ou une autre approche, je suis définitivement ouvert à. merci d'avance.Télécharger un fichier zip sur un disque local et extraire tous les fichiers vers un dossier de destination en utilisant python 2.5

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

sourceFile = r"C:\Users\blueman\master\test2.5.zip" 
destDir = r"C:\Users\blueman\user" 
shutil.copy(sourceFile, destDir) 
print "file copied" 
###################################################### 

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

GLBzipFilePath =r'C:\Users\blueman\user\test2.5.zip' 
GLBextractDir =r'C:\Users\blueman\user' 

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

extract(GLBzipFilePath,GLBextractDir) 

###################################################### 

Répondre

2

Pour le téléchargement, regardez urllib:

import urllib 
webFile = urllib.urlopen(url) 

Pour décompressé, utilisez zipfile. Voir aussi this example.

+0

fait l'extr agir en 2.5? – marcus

+0

L'exemple que j'ai lié fonctionne probablement dans Python 2.5 car il n'utilise pas la nouvelle fonction ZipFile.extractall. –

13

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

extractall est en effet nouveau dans 2.6, mais dans 2.5, vous pouvez utiliser une boucle explicite (obtenir tous les noms, ouvrir chaque nom, etc). Avez-vous besoin d'un exemple de code? Donc, voici l'idée générale (plus besoin try/except si vous voulez donner un message d'erreur gentil dans chaque cas qui pourrait aller mal, dont, bien sûr, il y a un million de variantes - je suis en utilisant seulement deux de ces cas, à titre d'exemple ...):

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) 
+0

oui je fais je suis un super débutant en python. Merci pour les directions – marcus

+0

Je bricolais avec le script depuis un certain temps et je dois revenir.Bien que "pour n dans z.namelist():" se réfère à tous les fichiers. Je n'arrive pas à décompresser les dossiers dans le fichier zip et à maintenir la structure du fichier dans le fichier zip. merci encore une fois – marcus

+0

@marcus, le code que j'ai donné fonctionne très bien pour moi: pourquoi ne pas poster exactement quelle erreur vous obtenez plutôt que le générique "ne peut pas sembler pouvoir"?! Évidemment, personne ne peut vous aider sans information. –

2

le chemin le plus court que j'ai trouvé jusqu'à présent, est d'utiliser réponse + alex, mais avec ZipFile.extractall() au lieu du 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() 
Questions connexes