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')