0
点赞
收藏
分享

微信扫一扫

zipfile用法

zipfile 模块是 Python 标准库的一部分,提供了用于创建、读取、写入、解压缩 ZIP 文件的功能。你在上面的代码中主要使用了 zipfile.ZipFile 类来创建和操作 ZIP 文件。以下是详细解释你代码中的 zipfile 模块用法,以及进一步的扩展。

1. 基本概念

  • zipfile.ZipFile 类用于创建和操作 ZIP 文件。
  • ZIP 文件 是一种压缩文件格式,能够将多个文件或文件夹压缩成单个文件,同时保留文件的目录结构。

2. 你使用到的功能解释

2.1 创建 ZIP 文件

with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:
    ...
  • zipfile.ZipFile(): 这是一个类,用于打开一个 ZIP 文件。它可以在多种模式下打开文件,如只读模式 'r'、写入模式 'w'、追加模式 'a' 等。
  • zip_name: 这是你要创建的 ZIP 文件的名称(包括路径)。
  • 'w': 表示写入模式,意味着会创建一个新的 ZIP 文件。如果文件已存在,它将被覆盖。
  • zipfile.ZIP_DEFLATED: 这是压缩算法,表示使用 deflate 压缩方法来压缩文件,这是 ZIP 文件的常见压缩算法。

通过 with 语句,Python 确保当代码块执行完毕时,ZIP 文件会被正确关闭,避免资源泄露。

2.2 向 ZIP 文件添加文件

zipf.write(full_path, arcname)
  • write(): 将文件添加到 ZIP 文件中。
    • full_path: 被压缩的文件的完整路径。
    • arcname: 在 ZIP 文件中保存的文件路径(相对路径)。通过指定相对路径,可以保留文件的目录结构。

2.3 保留目录结构

arcname = os.path.relpath(full_path, base_path)
  • os.path.relpath(): 返回 full_path 相对于 base_path 的相对路径。这使得在 ZIP 文件中能够保留文件的原始目录结构。

2.4 关闭 ZIP 文件

with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:

在这里使用 with 语句,Python 会自动在块结束时关闭 ZIP 文件。如果没有使用 with 语句,你需要手动调用 zipf.close() 来关闭文件。

3. zipfile 的其他常用功能

3.1 读取 ZIP 文件内容

你可以读取 ZIP 文件的内容,例如列出 ZIP 文件中的所有文件。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    zipf.printdir()
  • printdir(): 打印 ZIP 文件中的所有文件及其相关信息,如文件大小、压缩方式等。

3.2 解压 ZIP 文件

你可以解压 ZIP 文件中的所有文件或单个文件。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    # 解压所有文件到当前目录
    zipf.extractall()

    # 解压特定文件
    zipf.extract('test/task/file.txt', '/path/to/extract')
  • extractall(): 解压 ZIP 文件中的所有内容。
  • extract(name, path): 解压 ZIP 文件中的某个文件 namepath 指定的目录。

3.3 追加文件到现有 ZIP 文件

如果你想在已经存在的 ZIP 文件中添加文件,可以使用 'a' 模式:

with zipfile.ZipFile(zip_name, 'a', zipfile.ZIP_DEFLATED) as zipf:
    zipf.write('/path/to/newfile.txt', 'newfile.txt')
  • 'a' 模式: 追加模式,不会覆盖已存在的 ZIP 文件,而是往其中添加新的文件。

3.4 查看 ZIP 文件中的文件列表

你可以列出 ZIP 文件中的所有文件:

with zipfile.ZipFile(zip_name, 'r') as zipf:
    file_list = zipf.namelist()
    print(file_list)
  • namelist(): 返回 ZIP 文件中所有文件的名称列表。

3.5 检索 ZIP 文件中的文件信息

可以获取 ZIP 文件中各个文件的详细信息,例如文件大小、压缩大小等。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    for info in zipf.infolist():
        print(info.filename, info.file_size, info.compress_size)
  • infolist(): 返回 ZIP 文件中每个文件的 ZipInfo 对象。
  • ZipInfo: 包含文件的详细信息,如 filename(文件名)、file_size(原始大小)、compress_size(压缩后大小)等。

3.6 检查文件是否在 ZIP 中

你可以使用 getinfo() 来检查 ZIP 文件中是否存在某个文件。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    try:
        info = zipf.getinfo('test/task/file.txt')
        print("File found:", info.filename)
    except KeyError:
        print("File not found in ZIP")
  • getinfo(): 返回 ZIP 文件中指定文件的 ZipInfo 对象。如果文件不存在,会引发 KeyError 异常。

3.7 压缩不同类型的文件

zipfile 模块不仅支持文本文件,还支持压缩图片、视频等二进制文件:

with zipfile.ZipFile('media_files.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
    zipf.write('image.png')
    zipf.write('video.mp4')

3.8 设置 ZIP 文件的密码

虽然 zipfile 模块支持压缩和解压文件,但不直接支持设置密码。如果你想为 ZIP 文件加密,通常需要使用第三方库如 pyminizip7-Zip

# 使用 7-Zip 命令行加密 ZIP 文件
7z a -pYourPassword secure.zip file_to_compress.txt

总结

zipfile 模块提供了丰富的功能来创建、读取、解压和操作 ZIP 文件。结合你当前的需求,这些功能允许你:

  1. 压缩多个文件并保持目录结构。
  2. 编译 Python 文件并将 .pyc 文件添加到 ZIP 中。
  3. 读取 ZIP 文件的内容并解压文件。

通过拓展功能,你还可以:

  • 检查 ZIP 文件的详细信息。
  • 追加文件到现有 ZIP 文件。
  • 压缩和解压更多类型的文件。
举报

相关推荐

0 条评论