使用Python 2.5下载zip文件并提取到目标文件夹

3 投票
3 回答
21295 浏览
提问于 2025-04-15 16:13

我正在尝试把一个压缩文件下载到本地硬盘,并把里面的所有文件提取到一个指定的文件夹。

我想出了一个解决办法,但这个办法只能把文件从一个目录“下载”到另一个目录,并不能真正下载文件。关于提取文件,我在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 个回答

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

如果你想下载东西,可以看看urllib这个库:

import urllib
webFile = urllib.urlopen(url)

要解压缩文件,可以使用zipfile这个工具。你也可以参考这个例子

14

urllib.urlretrieve 可以从一个网址下载文件(无论是压缩文件还是其他类型),并把它保存到你指定的路径。

extractall 确实是在 Python 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)

撰写回答