zipfile可以在Python中压缩和解压缩ZIP文件

商业

Python标准库的zipfile模块可以用来将文件压缩成ZIP和解压缩ZIP文件。它包含在标准库中,所以不需要额外安装。

对以下内容进行了说明。

  • 将多个文件压缩成一个ZIP文件
  • 在现有的ZIP文件中添加一个新文件
  • 将一个目录(文件夹)压缩成一个ZIP文件
  • 压缩成一个带密码的ZIP文件
  • 检查ZIP文件的内容。
  • 提取(解压)ZIP文件的全部内容。
  • 选择ZIP文件的内容并解压。

将多个文件压缩成一个ZIP文件

创建一个ZipFile对象,并使用write()方法来添加你要压缩的文件。

要创建一个新的ZIP文件,指定要创建的ZIP文件的路径作为ZipFile对象构造函数的第一个参数,第二个参数如下所示'w'

此外,压缩方法可以被指定为第三个参数。

  • zipfile.ZIP_STORED:只需合并多个文件,无需压缩(默认)。
  • zipfile.ZIP_DEFLATED:正常的ZIP压缩(需要zlib模块)。
  • zipfile.ZIP_BZIP2:BZIP2压缩(需要bz2模块)。
  • zipfile.ZIP_LZMA:LZMA压缩(需要lzma模块)。

BZIP2和LZMA有更高的压缩率(可以压缩到更小的尺寸),但压缩所需的时间更长。

在write()方法中,第一个参数filename的文件被写到第二个参数arcname的ZIP文件中。如果省略arcname,文件名将被原样使用。arcname也可以指定一个目录结构。

ZipFile对象需要用close()方法关闭,但如果你使用with语句,它将在区块完成后自动关闭。

import zipfile

with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt')
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

通过指定write()方法的compress_type参数,还可以为每个文件选择压缩方法。

with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
    new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
    new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
    new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')

在现有的ZIP文件中添加一个新文件

要向现有的压缩文件添加新文件,在创建ZipFile对象时,将构造函数的第一个参数设置为现有压缩文件的路径。同时,设置第二个参数模式如下。'a'

然后,就像上面的例子一样,使用write()方法添加文件即可。

with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
    existing_zip.write('data/temp/test4.txt', arcname='test4.txt')

将一个目录(文件夹)压缩成一个ZIP文件

如果你想把整个目录(文件夹)压缩成一个单一的ZIP文件,你可以使用os.scandir()或os.listdir()来制作一个文件列表,但使用shutil模块中的make_archive()更容易。

见以下文章。

压缩成一个带密码的ZIP文件

zipfile模块不允许你创建有密码保护的ZIP。如果你想把一个文件压缩成一个受密码保护的ZIP文件,请使用第三方库pyminizip。

注意,受密码保护的ZIP的解压可以用zipfile模块来完成(见下文)。

检查ZIP文件的内容。

你可以检查现有ZIP文件的内容。

通过在构造函数中设置第一个参数file为现有ZIP文件的路径,第二个参数mode为'r',创建一个ZIP文件对象。模式参数可以省略,因为默认是'r'。

你可以使用ZipFile对象的namelist()方法来获取归档文件的列表。

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']

提取(解压)ZIP文件的全部内容。

要解压ZIP文件的内容,创建一个ZipFile对象,构造函数中的第一个参数file是现有ZIP文件的路径,第二个参数mode是'r',如上面的例子。mode参数可以省略,因为它的默认值是'r'。

ZipFile对象的extractall()方法可以提取(解压)ZIP文件的全部内容。第一个参数,path,指定了要提取的目录的路径。如果省略它,文件将被解压缩到当前目录。

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extractall('data/temp/ext')

有密码的ZIP文件可以通过指定密码作为extractall()方法的参数pwd来进行提取。

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extractall('data/temp/ext_pass', pwd='password')

选择ZIP文件的内容并解压。

如果你想只解压和提取某些文件,请使用 extract() 方法。

extract()方法的第一个参数是要提取的文件的名称,第二个参数path是要提取的目录的路径。如果省略path参数,文件将被提取到当前目录。要提取的文件的名称应该包括ZIP文件中的目录的路径,如果它是存储在那里的话。

with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
    existing_zip.extract('test1.txt', 'data/temp/ext2')

和extractall()方法一样,extract()方法也允许你指定一个密码作为参数pwd。

with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
    pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')
Copied title and URL