Skip to content

用 zipfile 模块压缩文件

你可能熟悉 ZIP 文件(带有 .zip 文件扩展名),它可以包含许多其他文件的压缩内容。压缩一个文件会减少它的大小,这在因特网上传输时很有用。因为一个 ZIP 文件可以包含多个文件和子文件夹,所以它是一种很方便的方式,将多个文件打包成一个文件。

利用 zipfile 模块中的函数,Python 程序可以创建和打开(或解压)ZIP 文件。

创建 ZIP 文件

要创建你自己的压缩 ZIP 文件,必须以“写模式”打开 ZipFile 对象,即传入 'w' 作为第二个参数(这类似于向 open() 函数传入 'w' ,以写模式打开一个文本文件)。

如果向 ZipFile 对象的 write() 方法传入一个路径,Python 就会压缩该路径所指的文件,将它加到 ZIP 文件中。

  • write() 方法的第一个参数是一个字符串,代表要添加的文件名。
  • 第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。可以总是将这个值设置为 zipfile.ZIP_DEFLATED(这指定了 deflate 压缩算法,它对各种类型的数据都很有效)。
python
import zipfile

"""创建压缩包"""

file_list = ['01 文件与文件路径.py', '02 绝对路径与相对路径.py', '03 文件夹操作.py']
with zipfile.ZipFile('自动化办公课件.zip', 'w') as zip_obj:
    for file in file_list:
        zip_obj.write(file)

# 向已有的压缩包内添加内容
# zip_obj.write(待添加的文件名)
with zipfile.ZipFile('自动化办公课件.zip', 'a') as zip_obj:
    zip_obj.write('04 路径处理.py')

这段代码将创建一个新的 ZIP 文件,名为 自动化办公课件.zip,它包含了几个压缩后的文件。

要记住,就像写入文件一样,写模式将擦除 ZIP 文件中所有原有的内容。如果只是希望将文件添加到原有的 ZIP 文件中,就要向 zipfile.ZipFile() 传入 'a' 作为第二个参数,以添加模式打开 ZIP 文件。

读取 ZIP 文件

要读取 ZIP 文件的内容,首先必须创建一个 ZipFile 对象(请注意大写首字母Z和F)。ZipFile 对象在概念上与 File 对象相似。 要创建一个 ZipFile 对象,就调用 zipfile.ZipFile() 函数,向它传入一个字符串,表示 .zip 文件的文件名。

请注意,zipfile 是 Python 模块的名称,ZipFile() 是函数的名称。

例如,输入以下代码:

python
import zipfile

"""读取压缩包信息"""
with zipfile.ZipFile('自动化办公课件.zip', 'r') as zip_obj:
    # print(zip_obj.namelist())
    for filename in zip_obj.namelist():
        # 中文有时候会乱码
        # print(filename.encode('cp437').decode('gbk'))
        # print(filename)

        """获取详细信息
        .file_size 是原始文件大小
        .compress_size 是压缩后大小
        输出结果单位是字节
        """
        info = zip_obj.getinfo(filename)
        print(filename, info.file_size, info.compress_size)

ZipFile 对象有一个 namelist() 方法,返回 ZIP 文件中包含的所有文件和文件夹的字符串的列表。这些字符串可以传递给 ZipFile 对象的 getinfo() 方法,返回一个关于特定文件的 ZipInfo 对象。ZipInfo 对象有自己的属性,诸如表示字节数的 file_sizecompress_size ,它们分别表示原来文件大小和压缩后文件大小。ZipFile 对象表示整个归档文件,而 ZipInfo 对象则保存该归档文件中每个文件的有用信息。

解压缩

ZipFile 对象的 extractall() 方法从 ZIP 文件中解压缩所有文件和文件夹,放到当前工作目录中。

python
import zipfile

"""解压操作"""
with zipfile.ZipFile('自动化办公课件.zip', 'r') as zip_obj:
    """ 解压单个文件
        zipobj.extract(压缩包内要解压的文件名)
        zipobj.extract(压缩包内要解压的文件名,解压到哪个位置)

        中文乱码,重新调整编码
        for filename in zipobj.namelist():
            current_path = filename.encode('cp437').decode('gbk')

        建议路径下中文文件和文件夹不要出现中文
        如果有中文的可以先获取正确的编码文字,再重命名

    """
    zip_obj.extract('07 glob.py')

with zipfile.ZipFile('自动化办公课件.zip', 'r') as zip_obj:
    """ 解压多个文件
        .extractall(path=解压到哪个位置)
        .extractall(path=解压到哪个位置, pwd=b'密码')
    """
    zip_obj.extractall(path='./02-文件与目录')