将 zip 文件下载到本地驱动器并使用 python 2.5 将所有文件解压缩到目标文件夹
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1774434/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
download a zip file to a local drive and extract all files to a destination folder using python 2.5
提问by marcus
I am trying to download a zip file to a local drive and extract all files to a destination folder.
我正在尝试将 zip 文件下载到本地驱动器并将所有文件解压缩到目标文件夹。
so i have come up with solution but it is only to "download" a file from a directory to another directory but it doesn't work for downloading files. for the extraction, I am able to get it to work in 2.6 but not for 2.5. so any suggestions for the work around or another approach I am definitely open to. thanks in advance.
所以我想出了解决方案,但它只是将文件从一个目录“下载”到另一个目录,但它不适用于下载文件。对于提取,我可以让它在 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)
######################################################
回答by Alex Martelli
urllib.urlretrievecan get a file (zip or otherwise;-) from a URL to a given path.
urllib.urlretrieve可以从 URL 到给定路径获取文件(zip 或其他方式;-)。
extractall
is indeed new in 2.6, but in 2.5 you can use an explicit loop (get all names, open each name, etc). Do you need example code?
extractall
在 2.6 中确实是新的,但在 2.5 中你可以使用显式循环(获取所有名称,打开每个名称等)。你需要示例代码吗?
So here's the general idea (needs more try
/except
if you want to give a nice error message in each and every case which could go wrong, of which, of course, there are a million variants -- I'm only using a couple of such cases as examples...):
所以这是一般的想法(需要更多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)
回答by Ohad Cohen
The shortest way i've found so far, is to use +alex answer, but with ZipFile.extractall()instead of the loop:
到目前为止,我发现的最短方法是使用 +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()
回答by Mark Byers
For downloading, look at urllib:
下载请看urllib:
import urllib
webFile = urllib.urlopen(url)
For unzipping, use zipfile. See also this example.