如何使用 Python 递归压缩文件夹?


众所周知,文件压缩是 Python 软件开发和数据管理中的常规任务。递归压缩文件夹是一项宝贵的技能,它允许您不仅压缩顶层文件夹,还压缩其所有子目录和文件;这将创建一个组织良好且节省空间的归档文件。Python凭借其多功能性和广泛的标准库,提供了多种有效完成此任务的方法。

在这篇全面而详尽的文章中,我们将探讨使用 Python 递归压缩文件夹的各种方法。我们提供了分步说明和代码示例来指导您完成整个过程。如果您需要创建备份、传输大量数据或减少存储空间,掌握递归文件夹压缩的技巧将成为您编程之旅中的一项强大资产。

让我们踏上这段激动人心的旅程,探索使用 Python 递归压缩文件夹的奥秘!

使用 shutil.make_archive() 进行简单的文件夹压缩

Python 的“shutil”模块提供了“make_archive()”函数,该函数提供了一种直接的方法来递归压缩文件夹。

示例

Python 中的“shutil”模块提供了一种简单的方法,可以使用“make_archive()”函数递归压缩文件夹。为了进行此练习,我们首先导入“shutil”模块,该模块提供高级文件操作。接下来,我们定义“zip_folder_with_shutil()”函数,允许我们递归压缩文件夹。在此函数中,我们调用“shutil.make_archive()”并提供“source_folder”和“output_path”以创建“zip”格式的 zip 归档文件。通过利用“make_archive()”,整个文件夹及其子目录和文件都会被压缩,从而实现递归压缩。

import shutil

def zip_folder_with_shutil(source_folder, output_path):
   shutil.make_archive(output_path, 'zip', source_folder)

利用 zipfile.ZipFile 进行细粒度控制

Python 的“zipfile”模块提供了对压缩过程的更多控制,允许我们指定压缩选项并处理归档文件的各个方面。

示例

为了更好地控制压缩过程,Python 的“zipfile”模块可以提供帮助。它允许我们指定压缩选项并管理归档文件的各个方面。首先,我们导入“os”模块以进行文件和目录操作,以及“zipfile”模块以处理 zip 归档文件。接下来,我们定义“zip_folder_with_zipfile()”函数,该函数使我们能够以更精细的控制来递归压缩文件夹。在此函数内部,我们使用“zipfile.ZipFile”在“output_path”处创建一个新的 zip 归档文件,使用“w”模式进行写入,并使用“zipfile.ZIP_DEFLATED”作为压缩方法。“with”语句确保在代码块执行完毕后,“ZipFile”被正确关闭。

此外,我们使用“os.walk()”递归遍历“source_folder”,处理每个文件。对于每个文件,我们使用“os.path.join()”获取其完整路径,并使用“os.path.relpath()”计算相对于“source_folder”的相对路径。最后,我们使用“zipf.write()”将文件添加到归档文件中,使用计算出的相对路径作为归档路径。

import os
import zipfile

def zip_folder_with_zipfile(source_folder, output_path):
   with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
      for root, dirs, files in os.walk(source_folder):
         for file in files:
            file_path = os.path.join(root, file)
            archive_path = os.path.relpath(file_path, source_folder)
            zipf.write(file_path, archive_path)

根据条件压缩特定文件

在某些情况下,您可能希望根据某些条件仅将特定文件包含在 zip 归档文件中。Python 的“zipfile”模块允许我们筛选文件并仅包含满足特定条件的文件。

示例

在特定情况下,我们可能需要根据特定条件仅将某些文件包含在 zip 归档文件中。Python 的“zipfile”模块允许我们筛选文件并仅包含满足这些条件的文件。我们继续使用“os”和“zipfile”模块。“zip_files_by_condition()”函数使我们能够通过基于给定条件压缩特定文件来实现此目的。与之前类似,我们使用“zipfile.ZipFile”在“output_path”处创建一个新的 zip 归档文件,使用“w”模式和“zipfile.ZIP_DEFLATED”作为压缩方法。“condition_func”参数是一个函数,用于评估每个文件的条件。如果满足条件,则将文件包含在归档文件中;否则,将跳过该文件。

import os
import zipfile

def zip_files_by_condition(source_folder, output_path, condition_func):
   with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
      for root, dirs, files in os.walk(source_folder):
         for file in files:
            file_path = os.path.join(root, file)
            if condition_func(file_path):
               archive_path = os.path.relpath(file_path, source_folder)
               zipf.write(file_path, archive_path)

使用 try...except 优雅地处理错误

在处理文件操作时,由于各种原因可能会发生错误,例如权限不足或文件不存在。为了确保提供健壮且用户友好的解决方案,务必优雅地处理此类错误。

示例

在处理文件操作时,有效处理错误至关重要。由于各种原因可能会发生错误,例如权限不足或文件不存在。为了确保提供健壮且用户友好的解决方案,我们使用“try...except”块增强了“zip_folder_with_zipfile()”函数以进行错误处理。新的函数“zip_folder_safely()”允许我们递归压缩文件夹,同时优雅地处理错误。在“with”语句中,我们将压缩过程用“try...except”块包装起来,以处理在 zip 创建过程中可能发生的错误。此外,我们在文件处理循环中实现了另一个“try...except”块,以处理特定错误,例如对于可能自遍历时间以来已被删除的文件的“FileNotFoundError”。

import os
import zipfile

def zip_folder_safely(source_folder, output_path):
   try:
      with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
         for root, dirs, files in os.walk(source_folder):
            for file in files:
               file_path = os.path.join(root, file)
               try:
                  archive_path = os.path.relpath(file_path, source_folder)
                  zipf.write(file_path, archive_path)
               except FileNotFoundError:
                  print(f"File not found: {file_path}")
               except Exception as e:
                  print(f"An error occurred: {e}")
   except Exception as e:
      print(f"An error occurred while creating the zip archive: {e}")

使用 shutil.make_archive() 和不同的压缩格式

“shutil.make_archive()”函数支持各种压缩格式。通过选择合适的格式,您可以根据您的特定需求定制 zip 归档文件。

示例

“shutil.make_archive()”函数提供了对各种压缩格式的支持,允许我们根据特定需求定制 zip 归档文件。在此“zip_folder_with_shutil()”函数的变体中,我们允许用户将压缩格式指定为参数。“zip_folder_with_different_formats()”函数使我们能够以不同的压缩格式递归压缩文件夹。“format”参数可以采用“zip”(默认)、“tar”、“gztar”、“bztar”、“xztar”等值,具体取决于您的 Python 环境支持的可用压缩格式。通过选择特定格式,您可以优化归档文件的兼容性、压缩级别和存储空间,有效满足您的需求。

import shutil

def zip_folder_with_different_formats(source_folder, output_path, format):
   shutil.make_archive(output_path, format, source_folder)

总而言之,在这篇广泛的文章中,我们探讨了使用 Python 递归压缩文件夹的各种方法。从简单的“shutil.make_archive()”函数到“zipfile”模块提供的更高级选项,我们学习了如何控制压缩过程、根据条件筛选文件、优雅地处理错误以及选择不同的压缩格式来定制 zip 归档文件以满足我们需求的技能。通过掌握这些技巧,您将具备高效的文件压缩能力,从而能够有效地管理备份、传输数据并优化存储。请务必考虑数据大小、压缩格式和错误处理,以确保压缩过程顺利且可靠。最好在不同的场景和极端情况下测试您的代码,以保证其健壮性。祝您在 Python 冒险之旅中继续蓬勃发展,轻松自信地递归压缩文件夹!

更新于: 2023年8月22日

5K+ 阅读量

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告