如何使用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”以“w”模式(写入模式)和“zipfile.ZIP_DEFLATED”作为压缩方法来创建一个新的zip存档。“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”以“w”模式和“zipfile.ZIP_DEFLATED”作为压缩方法来创建一个新的zip存档。“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”模块提供的更高级选项,我们学习了如何控制压缩过程、根据条件过滤文件、优雅地处理错误以及选择不同的压缩格式以满足我们需求的技能。通过掌握这些技巧,您将掌握高效的文件压缩能力,从而有效地管理备份、传输数据和优化存储。请记住考虑数据大小、压缩格式和错误处理,以确保压缩过程顺利可靠。最好用不同的场景和边缘情况测试您的代码,以保证其健壮性。祝您的Python冒险之旅继续蓬勃发展,让您轻松自信地递归压缩文件夹!

更新于:2023年8月22日

6000+ 次浏览

启动您的职业生涯

完成课程获得认证

开始学习
广告