Chinaunix首页 | 论坛 | 博客
  • 博客访问: 168070
  • 博文数量: 24
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 399
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-04 15:36
文章分类

全部博文(24)

文章存档

2017年(2)

2015年(5)

2014年(9)

2013年(8)

我的朋友

分类: Python/Ruby

2014-04-15 21:24:34

今天用python zipfile模块写了一个文件夹打包zip和解包zip程序,感觉python真是强大,短短几行代码就能实现,越来越喜欢python了.

压缩文件夹时需要遍历整个目录,这里有两个函数需要特别注意: os.walk(...)和os.path.walk().
这两个函数的返回值是有些区别的
os.walk(path)会返回path目录下的所有文件(注意是所有文件)列表,而没有子目录下的文件
os.path.walk(path)会遍历所有文件和子目录下的文件,不过他的调用方式有些特别
------------------------------------------------------------------
def walkfiles(arg, dir, files):
    pass

os.path.walk(path, walkfiles, arg)
------------------------------------------------------------------
os.path.walk第一个参数就是你要遍历的文件夹名,walkfiles是一个回调函数,它会针对每一个文件夹进行调用,所以walkfiles(...)的第2个参数我写成dir,它代码当前遍历的文件夹名,files则表示文件夹下的文件列表.os.path.walk的第3个参数是一个附加参数,它将会不加修改地传递给walkfiles(arg, ...),用惯回调的话,这个肯定懂得.


下面代码压缩当前工程目录,并解压

import os
import zipfile

def zip_path(path, zip):    
    def seefiles(arg, dir, files):
        z = arg[0]
        toppath = arg[1]
        
        for f in files:
            z.write(os.path.join(dir.strip(toppath), f))
    
    zf = zipfile.ZipFile(file=zip, mode='w')
    os.path.walk(path, seefiles, (zf, path))
    zf.close()
    
def unzip(zip, dstpath):
    os.mkdir(dstpath)
    
    zf = zipfile.ZipFile(file=zip, mode="r")
    for f in zf.namelist():
        if os.path.isdir(f):
            os.mkdir(os.path.join(dstpath, f))
        else:
            out = open(os.path.join(dstpath, f), "wb")
            out.write(zf.read(f))
            out.close()
    zf.close()
            
    
if __name__ == '__main__':
    zip_path(os.getcwd(), "../hhh.zip")
    unzip("../hhh.zip", os.path.join(os.getcwd(), "../hh2/"))
阅读(3258) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~