9.16. 使用python管理压缩包

9.16.1. 使用tarfile库读取和创建tar包

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/3/20 10:48
# filename: sample01.py

import tarfile

with tarfile.open('tarfile_add.tar', "w:gz") as t:
    for member_info in t.getmembers():
        print(member_info.name)

创建tar包

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/3/20 10:48
# filename: sample01.py

import tarfile
import os

with tarfile.open('tarfile_add.tar', mode="w") as out:
    out.add("README.txt")

使用tarfile库读取与创建压缩包

  1. 读取一个用gzip算法压缩的tar包

with tarfile.open('tarfile_add.tar',mode='r:gz') as out:
  1. 创建一个用bzip2算法压缩的tar包

with tarfile.open('tarfile_add.tar',mode='w:bz2') as out:

备份指定文件到压缩包中

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/3/20 10:59
# filename: sample01.py
import os
import fnmatch
import tarfile
import datetime


def is_file_match(filename, patterns):
    """
    :param filename:  文件名
    :param patterns:   匹配跪着
    :return: True or False
    """
    for pattern in patterns:
        if fnmatch.fnmatch(filename, pattern):
            return True
    return False


def find_specific_files(root, patterns=['*'], exclude_dirs=[]):
    """
    :param root:  搜索目录
    :param patterns:  匹配规则,可以多项
    :param exclude_dirs:   排除目录
    :return:
    """
    for root, dirnames, filenames in os.walk(root):
        for filename in filenames:
            if is_file_match(filename, patterns):
                yield os.path.join(root, filename)
        for d in exclude_dirs:
            if d in dirnames:
                dirnames.remove(d)


def main():
    patterns = ["*.jpg", "*.jpeg", "*.png", "*.tif", "*.tiff"]
    now = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
    filename = "all_images_{0}.tar.gz".format(now)
    with tarfile.open(filename, "w:gz") as f:
        for item in find_specific_files(".", patterns):
            f.add(item)


if __name__ == '__main__':
    main()

9.16.2. 使用zipfile库创建和读取zip压缩包

1.读取zip文件

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/3/20 11:10
# filename: sample01.py
import zipfile

example_zip = zipfile.ZipFile("sample01.zip")
print(example_zip.namelist())
# example_zip.extract("sample01.py")
# example_zip.extractall(".")

"""
ZipFile的常用方法如下:
    namelist:返回zip文件中包含的所以文件和文件夹的字符串列表
    extract:从zip文件中提取单个文件
    extractall:从zip文件中提取所以文件
"""

2.创建zip文件

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/3/20 11:35
# filename: sample01.py
import zipfile

# newZip = zipfile.ZipFile('new.zip', 'w')
# newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)
# newZip.close()


with zipfile.ZipFile('new.zip', 'w') as newZip:
    newZip.write('spam.txt', compress_type=zipfile.ZIP_DEFLATED)

3.将一个文件夹备份到一个ZIP文件

import zipfile, os


def backupToZip(folder):
    # 将目录转换为绝对路径
    folder = os.path.abspath(folder)

    # 遍历当前目录,看是否已经存在备份文件
    number = 1
    while True:
        zipFilename = os.path.basename(folder) + '_' + str(number) + '.zip'
        # 如果不存在备份文件,则break 从1 开始备份
        if not os.path.exists(zipFilename):
            break

        print("已经存在备份包:%s" % zipFilename)
        # 否则继续循环遍历
        number = number + 1

    # 创建新的压缩文件
    print('Creating %s...' % (zipFilename))
    backupZip = zipfile.ZipFile(zipFilename, 'w')

    # 遍历目录,将目录中的所有文件添加到压缩包中
    for foldername, subfolders, filenames in os.walk(folder):
        print('Adding files in %s...' % (foldername))

        # 添加当前目录的文件到压缩包中
        backupZip.write(foldername)

        # 将所有文件添加入压缩包中
        for filename in filenames:
            newBase = os.path.basename(folder) + '_'

            # 备份文件时,略过备份文件
            if filename.startswith(newBase) and filename.endswith('.zip'):
                continue

            print("add file %s -----" % os.path.join(foldername, filename))
            backupZip.write(os.path.join(foldername, filename))

    backupZip.close()

    print('Done.')


backupToZip('./')

9.16.3. 使用shutil创建和读取压缩包

shutil创建压缩包

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/3/20 11:41
# filename: sample01.py
import shutil

shutil.make_archive("backup", "gztar")

shutil.make_archive("backup01", "zip")

使用shutil读取压缩包

def unpack_archive(filename, extract_dir=None, format=None):
    """Unpack an archive.

    `filename` is the name of the archive. #压缩包的名称

    `extract_dir` is the name of the target directory, where the archive
    is unpacked. If not provided, the current working directory is used.        # 压缩以后的保存目录

    `format` is the archive format: one of "zip", "tar", or "gztar". Or any     # 指定压缩包的格式
    other registered format. If not provided, unpack_archive will use the
    filename extension and see if an unpacker was registered for that
    extension.
#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2020/3/20 11:46
# filename: sample02.py
import shutil

shutil.unpack_archive("backup.tar.gz", extract_dir="../")