将 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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-03 23:01:16  来源:igfitidea点击:

download a zip file to a local drive and extract all files to a destination folder using python 2.5

pythonhttpdownloadextractunzip

提问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 或其他方式;-)。

extractallis 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/exceptif 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.

要解压缩,请使用zipfile。另请参见此示例