Python压缩解压模块zipfile的简单用法

zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了

比如要读取一个zipfile,这里假设filename是一个文件的路径:

import zipfile
z = zipfile.ZipFile(filename, 'r') # 这里的第二个参数用r表示是读取zip文件,w是创建一个zip文件
for f in z.namelist():
    print(f)


上面的代码是读取一个zip压缩包里所有文件的名字。z.namelist() 会返回压缩包内所有文件名的列表。
再看看下面一个:

import zipfile
z = zipfile.ZipFile(filename, 'r')
for i in z.infolist():
    print(i.file_size, i.header_offset)


这里使用了z.infolist(), 它返回的就是压缩包内所有文件的信息,就是一个ZipInfo的列表。一个ZopInfo对象中包含了压缩包内一个文件的信息,其中比较常用的是 filename, file_size, header_offset, 分别为文件名,文件大小,文件数据在压缩包中的偏移。其实之前的z.namelist()就是读取的ZopInfo中的filename,组成一个 list返回的。

从压缩包里解压缩出一个文件的方法是使用ZipFile的read方法:

import zipfile
z = zipfile.ZipFile(filename, 'r')
print(z.read(z.namelist()[0]))

这样就读取出z.namelist()中的第一个文件,并且输出到屏幕,当然也可以把它存储到文件

下面上了一个压缩解压的例子

#!/usr/bin/python3
#coding:utf-8

import os
import zipfile

def zip_dir(file_path,zfile_path):
    '''
    function:压缩
    params:
        file_path:要压缩的件路径,可以是文件夹
        zfile_path:解压缩路径
    description:可以在python2执行
    '''
    filelist = []
    if os.path.isfile(file_path):
        filelist.append(file_path)
    else :
        for root, dirs, files in os.walk(file_path):
            for name in files:
                filelist.append(os.path.join(root, name))
                print('joined:',os.path.join(root, name),dirs)

    zf = zipfile.ZipFile(zfile_path, "w", zipfile.zlib.DEFLATED)
    for tar in filelist:
        arcname = tar[len(file_path):]
        zf.write(tar,arcname)
    zf.close()

def unzip_file(zfile_path, unzip_dir):
    '''
    function:解压
    params:
        zfile_path:压缩文件路径
        unzip_dir:解压缩路径
    description:
    '''
    try:
        with zipfile.ZipFile(zfile_path) as zfile:
        zfile.extractall(path=unzip_dir)
    except:
        print (zfile_path+" is a bad zip file ,please check!")

if __name__ == '__main__':
    #压缩
    zip_dir(r'D:/www/api',r'D:/www/api.zip')
    #解压
    unzip_file(r'D:/www/api.zip',r'D:/www/api')


内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/577.html

我要评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。