12.12. zipfile、tarfile模块学习

12.12.1. 1. zipfile模块

定义的类和异常 class zipfile.ZipFile 模块最重要的类。用于读写ZIP文件。

class zipfile.PyZipFile 创建包含Python库的ZIP归档文件的类

class zipfile.ZipInfo(filename=‘NoName’, date_time=(1980, 1, 1, 0, 0, 0)) 用于显示ZIP文件信息的类。ZIP对象的getinfo()或infolist()方法会返回一个该类的实例。filename是ZIP文件的完整名称。date_time是一个包含6个元素的元组,描述文件最近修改时间。

zipfile.is_zipfile(filename) 如果文件是个ZIP文件则返回True,否则False。

zipfile.ZIP_STORED 未压缩的归档文件的数字常数。

zipfile.ZIP_DEFLATED 常用的ZIP压缩方法。

zipfile.ZIP_BZIP2 BZIP2压缩方法的数字常量。

zipfile.ZIP_LZMA LZMA压缩方法的数字常量。

exception zipfile.BadZipFile ZIP文件被损坏异常。3.2版本新增。

exception zipfile.LargeZipFile 当需要ZIP64功能,但未开启该功能时弹出异常。

zipfile模块其实很简单,记住下面几个重要的方法就可以了。

方法

用途

z = zipfile.ZipFile()

打开或者新建一个zip文件对象

z.write()

添加文件到压缩包内

z.infolist()

查看压缩包内的文件信息

z.extract()

解压单个文件

z.extractall()

解压所有文件

z.close()

关闭压缩文件

# 压缩zip
import zipfile,os
f = zipfile.ZipFile('filename.zip', 'w' ,zipfile.ZIP_DEFLATED)    # ZIP_STORE 为默认表不压缩. ZIP_DEFLATED 表压缩
#f.write('file1.txt')                              # 将文件写入压缩包
for path,dir,files in os.walk("tartest"):          # 递归压缩目录
    for file in files:
        f.write(os.path.join(path,file))           # 将文件逐个写入压缩包
f.close()


# 解压zip
if zipfile.is_zipfile('filename.zip'):             # 判断一个文件是不是zip文件
    f = zipfile.ZipFile('filename.zip')
    for file in f.namelist():                      # 返回文件列表
        f.extract(file, r'/tmp/')                  # 解压指定文件
    #f.extractall()                                # 解压全部
    f.close()

#把zip文件解压缩
#!/usr/bin/python
import zipfile
zfile = zipfile.ZipFile('archive.zip','r')
for filename in zfile.namelist():
    data = zfile.read(filename)
    file = open(filename, 'w+b')
    file.write(data)
    file.close()
import zipfile
def meta_info(names):
    with zipfile.ZipFile(names) as zf:
        for info in zf.infolist():
            print(info.filename)
            if info.create_system == 0:
                system = 'Windows'
            elif info.create_system == 3:
                system = 'Unix'
            else:
                system = 'UNKNOWN'
            print("System         :", system)
            print("Zip Version    :", info.create_version)
            print("Compressed     :", info.compress_size, 'bytes')
            print("Uncompressed   :", info.file_size, 'bytes')
            print()


if __name__ == '__main__':
    meta_info('work.zip'

1.1 压缩zip文件

代码示例

import zipfile
import glob
import os

fileZip = zipfile.ZipFile("out41.zip", "w")
for name in glob.glob("./uwsgi/*"):  # 遍历当前目录uwsgi下的所有文件
    # print(name)
    fileZip.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED)
fileZip.close()

1.2 读取zip文件

代码示例

import zipfile

listZipInfo = zipfile.ZipFile("out41.zip", "r")
print(listZipInfo.namelist())
print("\n")

for info in listZipInfo.infolist():
    # 显示文件名,文件大小,文件压缩结果大小
    print("文件名:{} 文件大小:{} 压缩后的大小:{}".format(info.filename, info.file_size, info.compress_size))

1.3 解压缩zip文件

import zipfile

Fileunzip = zipfile.ZipFile("out41.zip")
Fileunzip.extractall("out41")
Fileunzip.close()

12.12.2. 2. tarfile模块

tarfile模块看似复杂,其实也很简单,只需要掌握下面几个重点方法就可以了:

方法

用途

t = tarfile.open()

打开或新建一个归档文件,返回一个TarFile类型的对象t

t.getmembers()

获取包内所有成员的信息

t.add()

将指定文件加入包内

t.extract()

解包指定文件

t.extractall()

解包所有文件

TarFile.close()

关闭TarFile文件

# 压缩tar.gz
import os
import tarfile
tar = tarfile.open("/tmp/tartest.tar.gz","w:gz")   # 创建压缩包名
for path,dir,files in os.walk("/tmp/tartest"):     # 递归文件目录
    for file in files:
        fullpath = os.path.join(path,file)
        tar.add(fullpath)                          # 创建压缩包
tar.close()

def tar_gz(fname, pwd):
    """
    把当前目录下的fname,打成fname.tar.gz
    :param fname:
    :return:
    """
    t = tarfile.open(fname + ".tar.gz", "w:gz")
    for root, dir, files in os.walk(fname):
        for file in files:
            fullpath = os.path.join(root, file)
            t.add(fullpath)
    t.close()



# 解压tar.gz
import tarfile
tar = tarfile.open("/tmp/tartest.tar.gz")
#tar.extract("/tmp")                               # 全部解压到指定路径
names = tar.getnames()                             # 包内文件名
for name in names:
    tar.extract(name,path="./")                    # 解压指定文件
tar.close()

代码示例

import tarfile

tar_file = tarfile.open("work.tar.gz", "w:gz")
for name in ["welcome.py", "hello.py", "hello.txt", "sample.txt", "sample1.txt"]:
    tar_file.add(name)
tar_file.close()