使用Python 2.5将一个zip文件下载到本地驱动器并将所有文件提取到目标文件夹

3

我正在尝试将一个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)

######################################################
3个回答

14

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)

是的,我是Python的超级新手。感谢您的指导。 - marcus
我一直在调试脚本,但最终还是得回来了。虽然 "for n in z.namelist():" 可以引用所有文件,但我似乎无法解压缩 zip 文件中的文件夹并保持 zip 文件中的文件结构。再次感谢。 - marcus
@马库斯,我给出的代码对我来说非常有效:为什么不直接发布你所遇到的错误,而不是完全泛泛而谈的“似乎无法”?显然,没有信息,没有人能够帮助你。 - Alex Martelli

2

下载可以使用urllib:

import urllib
webFile = urllib.urlopen(url)

解压缩可以使用zipfile库,这个示例也很有参考价值。


我链接的示例可能在Python 2.5中有效,因为它没有使用新函数ZipFile.extractall。 - Mark Byers

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接