2008-11-17 64 views
27

一旦我在特定文件夹中具有所有需要的文件,我想让我的python脚本压缩文件夹内容。如何使用python(版本2.5)压缩文件夹的内容?

这可能吗?

我该怎么去做呢?

+0

答案,对于现代的Python,是在[此处](http://stackoverflow.com/q/1855095/541136) – 2017-03-14 19:08:00

回答

31

改编的the script版本是:

#!/usr/bin/env python 
from __future__ import with_statement 
from contextlib import closing 
from zipfile import ZipFile, ZIP_DEFLATED 
import os 

def zipdir(basedir, archivename): 
    assert os.path.isdir(basedir) 
    with closing(ZipFile(archivename, "w", ZIP_DEFLATED)) as z: 
     for root, dirs, files in os.walk(basedir): 
      #NOTE: ignore empty directories 
      for fn in files: 
       absfn = os.path.join(root, fn) 
       zfn = absfn[len(basedir)+len(os.sep):] #XXX: relative path 
       z.write(absfn, zfn) 

if __name__ == '__main__': 
    import sys 
    basedir = sys.argv[1] 
    archivename = sys.argv[2] 
    zipdir(basedir, archivename) 

例子:

C:\zipdir> python -mzipdir c:\tmp\test test.zip 

它创建'C:\zipdir\test.zip'归档与'c:\tmp\test'目录的内容。

+0

`ZFN = absfn [长度(BASEDIR)+ LEN (os.sep):]`为什么不是`absbasedir = os.path.abspath(basedir); os.path.relpath(absfn,absbasedir)`?另外,basedir和os.sep的长度可以看作是不变的,所以它应该在两个for循环之外。 – n611x007 2013-08-16 13:11:49

5

这里是一个递归版本

def zipfolder(path, relname, archive): 
    paths = os.listdir(path) 
    for p in paths: 
     p1 = os.path.join(path, p) 
     p2 = os.path.join(relname, p) 
     if os.path.isdir(p1): 
      zipfolder(p1, p2, archive) 
     else: 
      archive.write(p1, p2) 

def create_zip(path, relname, archname): 
    archive = zipfile.ZipFile(archname, "w", zipfile.ZIP_DEFLATED) 
    if os.path.isdir(path): 
     zipfolder(path, relname, archive) 
    else: 
     archive.write(path, relname) 
    archive.close() 
相关问题