我正在尝试将zip文件下载到本地驱动器并将所有文件解压缩到目标文件夹。
所以我提出了解决方案,但它只是将文件从目录“下载”到另一个目录,但它不适用于下载文件。对于提取,我能够让它在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)
######################################################
答案 0 :(得分:13)
urllib.urlretrieve可以从URL获取文件(zip或其他;-)到给定路径。
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)
答案 1 :(得分:2)
答案 2 :(得分:2)
到目前为止,我找到的最短路径是使用+ alex答案,但使用 ZipFile.extractall()代替循环:
std::initializer_list<int>