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 文件中的某个文件name
到path
指定的目录。
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 文件加密,通常需要使用第三方库如 pyminizip
或 7-Zip
。
# 使用 7-Zip 命令行加密 ZIP 文件
7z a -pYourPassword secure.zip file_to_compress.txt
总结
zipfile
模块提供了丰富的功能来创建、读取、解压和操作 ZIP 文件。结合你当前的需求,这些功能允许你:
- 压缩多个文件并保持目录结构。
- 编译 Python 文件并将
.pyc
文件添加到 ZIP 中。 - 读取 ZIP 文件的内容并解压文件。
通过拓展功能,你还可以:
- 检查 ZIP 文件的详细信息。
- 追加文件到现有 ZIP 文件。
- 压缩和解压更多类型的文件。