2009-11-21 3 views
2

Я пытаюсь загрузить zip-файл на локальный диск и извлечь все файлы в папку назначения.скачать zip-файл на локальный диск и извлечь все файлы в папку назначения с помощью python 2.5

поэтому у меня есть решение, но это всего лишь «загрузка» файла из каталога в другой каталог, но он не работает для загрузки файлов. для извлечения я могу заставить его работать в версии 2.6, но не для 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) 

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

ответ

2

Для скачивания, посмотрите на URLLIB:

import urllib 
webFile = urllib.urlopen(url) 

Для разархивирования используйте zipfile. См. Также this example.

+0

делает extr действовать в 2.5? – marcus

+0

Пример, который я связал, вероятно, работает в Python 2.5, поскольку он не использует новую функцию ZipFile.extractall. –

13

urllib.urlretrieve может получить файл (zip или иначе ;-) от URL-адреса до заданного пути.

extractall действительно новый в 2.6, но в 2.5 вы можете использовать явный цикл (получить все имена, открыть каждое имя и т. Д.). Вам нужен пример кода?

Итак, вот общая идея (требуется больше try/except, если вы хотите дать хорошее сообщение об ошибке в каждом случае, которое может пойти не так, из чего, конечно, есть миллион вариантов - я используя только несколько таких случаев в качестве примеров ...):

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

да я делаю я супер новичок в питоне. спасибо за указания – marcus

+0

Я некоторое время занимался скриптом, и мне нужно вернуться. Хотя «для n в z.namelist():» относится ко всем файлам. Кажется, я не могу распаковать папки в zip-файле и поддерживать файловую структуру в zip-файле. Еще раз спасибо – marcus

+0

@marcus, код, который я дал, отлично подходит для меня: почему бы не опубликовать именно ту ошибку, которую вы получаете, а не полностью общий «не может показаться, что это возможно» ?! Очевидно, никто не сможет помочь вам без информации. –

2

Самый короткий путь я нашел до сих пор является использование + AleX ответ, но с ZipFile.extractall() вместо петля:

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()