基本解压到当前目录
这是最简单的用法,将 ZIP 文件中的所有内容解压到当前脚本所在的目录。

import zipfile
# 指定要解压的 ZIP 文件名
zip_file_path = 'example.zip'
try:
# 使用 with 语句可以确保文件在操作后被正确关闭
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
# extractall() 方法会解压所有文件到当前目录
zip_ref.extractall()
print(f"'{zip_file_path}' 已成功解压到当前目录。")
except FileNotFoundError:
print(f"错误:找不到文件 '{zip_file_path}'")
except zipfile.BadZipFile:
print(f"错误:'{zip_file_path}' 不是有效的 ZIP 文件。")
except Exception as e:
print(f"发生未知错误: {e}")
代码解释:
import zipfile: 导入 Python 内置的zipfile模块。with zipfile.ZipFile(zip_file_path, 'r') as zip_ref::ZipFile()是用来打开或创建一个 ZIP 文件的。- 第一个参数
zip_file_path是你的 ZIP 文件的路径。 - 第二个参数
'r'表示“读取”模式。 with语句会自动管理文件的打开和关闭,即使发生错误也能保证资源被释放。
zip_ref.extractall(): 这是核心方法,它会将 ZIP 存档中的所有文件和目录提取到extractall()指定的路径中,如果不指定路径,则默认为当前工作目录。try...except: 这是一个良好的编程习惯,用于处理可能发生的异常,例如文件不存在或文件损坏。
解压到指定目录
如果你想将文件解压到特定的文件夹,只需在 extractall() 方法中提供目标路径即可。
import zipfile
import os # 导入 os 模块用于路径操作
zip_file_path = 'example.zip'
# 定义要解压到的目标目录
extract_to_path = 'my_unzipped_files'
# 如果目标目录不存在,则创建它
if not os.path.exists(extract_to_path):
os.makedirs(extract_to_path)
print(f"已创建目录: '{extract_to_path}'")
try:
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
# 将所有文件解压到指定的目标目录
zip_ref.extractall(path=extract_to_path)
print(f"'{zip_file_path}' 已成功解压到目录 '{extract_to_path}'。")
except FileNotFoundError:
print(f"错误:找不到文件 '{zip_file_path}'")
except zipfile.BadZipFile:
print(f"错误:'{zip_file_path}' 不是有效的 ZIP 文件。")
except Exception as e:
print(f"发生未知错误: {e}")
代码解释:
import os: 用于检查和创建目录。extract_to_path = 'my_unzipped_files': 设置你希望解压到的文件夹名称。os.makedirs(extract_to_path): 如果这个文件夹不存在,就创建它。zip_ref.extractall(path=extract_to_path):path参数指定了目标解压路径。
只解压单个文件
如果你只想从 ZIP 文件中提取一个特定的文件,可以使用 extract() 方法。

import zipfile
zip_file_path = 'example.zip'
# 指定要解压的文件名(注意大小写和路径)
file_to_extract = 'important_data.txt'
# 指定解压后的存放位置
output_path = '.'
try:
with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
# 检查文件是否存在于 ZIP 存档中
if file_to_extract in zip_ref.namelist():
zip_ref.extract(file_to_extract, path=output_path)
print(f"文件 '{file_to_extract}' 已成功解压到 '{output_path}'。")
else:
print(f"错误:在 '{zip_file_path}' 中未找到文件 '{file_to_extract}'。")
except FileNotFoundError:
print(f"错误:找不到文件 '{zip_file_path}'")
except zipfile.BadZipFile:
print(f"错误:'{zip_file_path}' 不是有效的 ZIP 文件。")
except Exception as e:
print(f"发生未知错误: {e}")
代码解释:
zip_ref.namelist(): 返回一个包含 ZIP 存档中所有文件和目录名称的列表,我们可以用它来检查文件是否存在。zip_ref.extract(file_to_extract, path=output_path):extract()方法接收两个参数:要提取的文件名和目标路径。
处理密码保护的 ZIP 文件
ZIP 文件有密码,你需要在打开 ZipFile 时提供密码。
import zipfile
zip_file_path = 'protected.zip'
extract_to_path = 'my_unzipped_files'
password = b'my_secret_password' # 密码必须是字节串(bytes),使用 b'...' 前缀
try:
# 使用 ZipFile 的第二个参数是 'r',并且提供 pwd 参数
with zipfile.ZipFile(zip_file_path, 'r', pwd=password) as zip_ref:
zip_ref.extractall(path=extract_to_path)
print(f"已成功解压加密的文件到 '{extract_to_path}'。")
except RuntimeError as e:
# 如果密码错误,会引发 RuntimeError
if "Bad password for file" in str(e):
print("错误:密码不正确。")
else:
print(f"运行时错误: {e}")
except FileNotFoundError:
print(f"错误:找不到文件 '{zip_file_path}'")
except zipfile.BadZipFile:
print(f"错误:'{zip_file_path}' 不是有效的 ZIP 文件。")
except Exception as e:
print(f"发生未知错误: {e}")
代码解释:
password = b'my_secret_password':zipfile要求密码是字节串,而不是字符串,使用b'...'来定义。with zipfile.ZipFile(zip_file_path, 'r', pwd=password) as zip_ref:: 在打开ZipFile时,通过pwd参数传入密码。- 如果密码错误,会抛出
RuntimeError。
高级用法:解压时覆盖已存在的文件 & 显示进度
zipfile 默认不会覆盖已存在的同名文件,如果你想强制覆盖,可以结合 os 模块手动实现。

import zipfile
import os
def extract_with_overwrite(zip_path, extract_to):
"""解压 ZIP 文件,并覆盖已存在的文件"""
if not os.path.exists(extract_to):
os.makedirs(extract_to)
with zipfile.ZipFile(zip_path, 'r') as zip_ref:
# 遍历 ZIP 文件中的每一个成员
for member in zip_ref.infolist():
# 创建目标文件的完整路径
target_path = os.path.join(extract_to, member.filename)
# 如果目标文件已存在,则先删除它
if os.path.exists(target_path):
os.remove(target_path)
print(f"已删除已存在的文件: {target_path}")
# 解压文件
zip_ref.extract(member, path=extract_to)
print(f"正在解压: {member.filename} -> {extract_to}")
# 使用示例
extract_with_overwrite('example.zip', 'my_unzipped_files')
代码解释:
zip_ref.infolist(): 返回一个ZipInfo对象的列表,每个对象代表 ZIP 存档中的一个成员(文件或目录)。os.path.join(extract_to, member.filename): 安全地拼接路径。os.path.exists(target_path): 检查文件是否存在。os.remove(target_path): 删除已存在的文件。zip_ref.extract(member, path=extract_to): 这里我们extract一个ZipInfo对象,而不是直接调用extractall(),这样可以更精细地控制每个文件的解压过程。
| 功能 | 方法 | 示例 |
|---|---|---|
| 解压全部 | extractall([path]) |
zip_ref.extractall('my_folder') |
| 解压单个 | extract(member, [path]) |
zip_ref.extract('file.txt', 'my_folder') |
| 处理密码 | ZipFile(..., pwd=password) |
with ZipFile(f.zip', 'r', pwd=b'pass') as z: |
| 检查文件是否存在 | member in zip_ref.namelist() |
if 'file.txt' in zip_ref.namelist(): |
| 覆盖文件 | 手动检查并删除 | if os.path.exists(target): os.remove(target) |
希望这份详细的指南能帮助你完全掌握 Python 中 zipfile 模块的使用!
