杰瑞科技汇

Python zipfile解压文件时如何指定路径?

基本解压到当前目录

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

Python zipfile解压文件时如何指定路径?-图1
(图片来源网络,侵删)
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}")

代码解释:

  1. import zipfile: 导入 Python 内置的 zipfile 模块。
  2. with zipfile.ZipFile(zip_file_path, 'r') as zip_ref::
    • ZipFile() 是用来打开或创建一个 ZIP 文件的。
    • 第一个参数 zip_file_path 是你的 ZIP 文件的路径。
    • 第二个参数 'r' 表示“读取”模式。
    • with 语句会自动管理文件的打开和关闭,即使发生错误也能保证资源被释放。
  3. zip_ref.extractall(): 这是核心方法,它会将 ZIP 存档中的所有文件和目录提取到 extractall() 指定的路径中,如果不指定路径,则默认为当前工作目录。
  4. 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() 方法。

Python zipfile解压文件时如何指定路径?-图2
(图片来源网络,侵删)
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 模块手动实现。

Python zipfile解压文件时如何指定路径?-图3
(图片来源网络,侵删)
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 模块的使用!

分享:
扫描分享到社交APP
上一篇
下一篇