Python命令如何用zipfile模块创建压缩文件 Python命令文件压缩的操作指南

看不見的法師
发布: 2025-08-13 16:29:01
原创
227人浏览过

python的zipfile模块支持zip_deflated和zip_stored两种主要压缩模式,前者使用deflate算法减小文件体积但消耗cpu时间,适合文本等未压缩文件,后者仅存储原始文件不压缩,速度快,适合已压缩的媒体文件或追求效率的场景;2. 添加多个文件时可通过遍历文件列表并逐个调用zf.write()实现,使用arcname=os.path.basename()可避免保留完整路径;3. 压缩整个文件夹需结合os.walk()递归遍历目录,并用os.path.relpath()计算文件在压缩包内的相对路径,以保留目录结构;4. 性能优化建议包括:始终使用with语句确保资源正确释放,选择合适的压缩模式以平衡速度与体积,避免在文件遍历中执行高开销操作,对于超大文件或海量小文件应注意内存使用并考虑更专业的工具,但zipfile模块对大多数场景已足够高效。

Python命令如何用zipfile模块创建压缩文件 Python命令文件压缩的操作指南

Python的

zipfile
登录后复制
模块是处理ZIP压缩文件的核心工具,用它来创建压缩文件其实非常直观。简单来说,就是打开一个ZIP文件对象,然后把你想压缩的文件一个接一个地“写入”这个对象,最后别忘了关闭它。它就像一个数字打包机,你告诉它要打包什么,它就帮你装进去。

解决方案

要使用

zipfile
登录后复制
模块创建压缩文件,基本流程是这样的:

import zipfile
import os

# 假设我们有一些文件要压缩
file_to_compress_1 = "example1.txt"
file_to_compress_2 = "example2.log"
output_zip_name = "my_archive.zip"

# 创建一些示例文件,方便测试
with open(file_to_compress_1, "w") as f:
    f.write("This is the content of example1.")
with open(file_to_compress_2, "w") as f:
    f.write("This is a log entry.\nAnother log entry.")

# 使用with语句确保文件对象被正确关闭,这是个好习惯
try:
    with zipfile.ZipFile(output_zip_name, 'w', zipfile.ZIP_DEFLATED) as zf:
        # 将第一个文件添加到压缩包
        zf.write(file_to_compress_1, arcname=os.path.basename(file_to_compress_1))
        # 将第二个文件添加到压缩包
        zf.write(file_to_compress_2, arcname=os.path.basename(file_to_compress_2))

    print(f"成功创建压缩文件:{output_zip_name}")

except Exception as e:
    print(f"创建压缩文件时发生错误:{e}")
finally:
    # 清理创建的示例文件
    if os.path.exists(file_to_compress_1):
        os.remove(file_to_compress_1)
    if os.path.exists(file_to_compress_2):
        os.remove(file_to_compress_2)
登录后复制

这段代码展示了最基本的压缩操作。

zipfile.ZipFile(output_zip_name, 'w', zipfile.ZIP_DEFLATED)
登录后复制
这行代码是关键,它创建了一个名为
my_archive.zip
登录后复制
的新ZIP文件,
'w'
登录后复制
表示写入模式(如果文件存在则覆盖),
zipfile.ZIP_DEFLATED
登录后复制
则指定了压缩方式。然后,
zf.write()
登录后复制
方法负责把文件放进去,
arcname
登录后复制
参数则可以指定文件在压缩包内部的路径和名称,这在处理目录结构时尤其有用。

立即学习Python免费学习笔记(深入)”;

Python zipfile模块支持哪些压缩模式,它们有什么区别

zipfile
登录后复制
模块在创建压缩文件时,主要支持两种核心的压缩模式,这两种模式的选择直接影响到压缩包的大小和压缩/解压的速度。了解它们的不同,能帮助你根据实际需求做出更合理的选择。

最常用的是

zipfile.ZIP_DEFLATED
登录后复制
。这是我们通常意义上的“压缩”,它会使用DEFLATE算法来减小文件体积。这种模式的优点显而易见:文件变小了,节省存储空间,传输也更快。但代价是,压缩和解压都需要消耗一定的CPU时间。对于大多数文本文件、代码文件、日志文件等,DEFLATE压缩效果通常非常好。

另一种模式是

zipfile.ZIP_STORED
登录后复制
。顾名思义,它只是“存储”文件,并没有进行任何压缩。文件会以原始大小直接放入ZIP包中。你可能会问,那还有什么意义?它的优势在于速度。因为没有压缩计算,文件添加和提取的速度都非常快,几乎是瞬间完成。这种模式适用于那些本身就已经高度压缩的文件(比如JPEG图片、MP4视频、MP3音频等),或者你根本不关心文件大小,只希望把多个文件打包成一个方便传输的情况。比如,你只是想把一堆图片文件集合到一个ZIP里方便管理,但图片本身已经压缩过了,再进行DEFLATE压缩可能效果甚微,甚至可能因为额外的计算反而变慢。

简单来说:

  • ZIP_DEFLATED
    登录后复制
    :追求文件体积小,但会耗费CPU时间。
  • ZIP_STORED
    登录后复制
    :追求速度快,文件体积不变。

选择哪种,就看你更看重“瘦身”还是“效率”了。通常情况下,如果你不确定,

ZIP_DEFLATED
登录后复制
是个稳妥的默认选项。

如何在压缩文件中添加多个文件或整个文件夹?

在实际应用中,我们很少只压缩一个文件。更多时候,是需要把一堆文件,甚至整个目录结构都打包进去。

zipfile
登录后复制
模块提供了灵活的方式来处理这些情况。

添加多个文件

如果你有一系列文件,比如一个列表,你可以简单地遍历这个列表,然后逐个添加到ZIP文件中。

Fotor AI Face Generator
Fotor AI Face Generator

Fotor 平台的在线 AI 头像生成器

Fotor AI Face Generator 50
查看详情 Fotor AI Face Generator
import zipfile
import os

files_to_add = ["doc1.txt", "image.jpg", "report.pdf"]
output_zip = "multi_files_archive.zip"

# 创建一些示例文件
for f_name in files_to_add:
    with open(f_name, "w") as f:
        f.write(f"Content for {f_name}")

try:
    with zipfile.ZipFile(output_zip, 'w', zipfile.ZIP_DEFLATED) as zf:
        for file_path in files_to_add:
            if os.path.exists(file_path):
                # arcname 指定了文件在压缩包内的路径/名称
                zf.write(file_path, arcname=os.path.basename(file_path))
            else:
                print(f"文件不存在,跳过:{file_path}")
    print(f"成功创建包含多个文件的压缩包:{output_zip}")
except Exception as e:
    print(f"添加多个文件时发生错误:{e}")
finally:
    for f_name in files_to_add:
        if os.path.exists(f_name):
            os.remove(f_name)
登录后复制

这里关键是循环

files_to_add
登录后复制
列表,每次调用
zf.write()
登录后复制
arcname=os.path.basename(file_path)
登录后复制
是一个很实用的技巧,它确保了文件在压缩包里只保留文件名,而不会把原始路径结构也带进去,这样解压出来会更干净。

添加整个文件夹

要压缩整个文件夹,包括其子文件夹和文件,就需要用到

os.walk()
登录后复制
函数了。
os.walk()
登录后复制
会递归地遍历指定目录下的所有文件和子目录,非常适合这种场景。

import zipfile
import os

folder_to_compress = "my_project_folder"
output_zip_folder = "project_archive.zip"

# 创建一个示例文件夹结构
os.makedirs(os.path.join(folder_to_compress, "subfolder1"), exist_ok=True)
os.makedirs(os.path.join(folder_to_compress, "subfolder2"), exist_ok=True)
with open(os.path.join(folder_to_compress, "main_file.py"), "w") as f: f.write("print('Hello')")
with open(os.path.join(folder_to_compress, "subfolder1", "config.ini"), "w") as f: f.write("[settings]")
with open(os.path.join(folder_to_compress, "subfolder2", "data.json"), "w") as f: f.write("{}")

try:
    with zipfile.ZipFile(output_zip_folder, 'w', zipfile.ZIP_DEFLATED) as zf:
        # os.walk 会生成 (dirpath, dirnames, filenames)
        for root, dirs, files in os.walk(folder_to_compress):
            for file in files:
                file_path = os.path.join(root, file)
                # 计算文件在zip包内的相对路径,这是关键!
                # 比如,如果 folder_to_compress 是 'my_project_folder'
                # file_path 是 'my_project_folder/subfolder1/config.ini'
                # 那么 arcname 就会是 'subfolder1/config.ini'
                arcname = os.path.relpath(file_path, folder_to_compress)
                zf.write(file_path, arcname=arcname)
    print(f"成功创建包含整个文件夹的压缩包:{output_zip_folder}")

except Exception as e:
    print(f"压缩文件夹时发生错误:{e}")
finally:
    # 清理示例文件夹
    import shutil
    if os.path.exists(folder_to_compress):
        shutil.rmtree(folder_to_compress)
登录后复制

这里最巧妙的部分是

arcname = os.path.relpath(file_path, folder_to_compress)
登录后复制
os.path.relpath()
登录后复制
函数能够计算出
file_path
登录后复制
相对于
folder_to_compress
登录后复制
的相对路径。这样,当文件被添加到ZIP包时,它会保留原始的目录结构,但会以
folder_to_compress
登录后复制
作为根目录。例如,如果你的源文件夹是
my_project_folder
登录后复制
,里面有个文件是
my_project_folder/src/main.py
登录后复制
,那么在ZIP包里,这个文件就会被存储为
src/main.py
登录后复制
,而不是
my_project_folder/src/main.py
登录后复制
,这通常是我们想要的效果。

压缩大型文件时,Python zipfile模块有哪些性能考量和优化建议?

当处理非常大的文件或大量文件时,

zipfile
登录后复制
模块的性能就变得尤为重要。虽然Python的I/O操作通常效率不错,但一些细节处理不当,还是可能导致内存占用过高或运行时间过长。

首先,内存使用是一个需要关注的点。

zipfile
登录后复制
模块在写入文件时,通常不会一次性将整个文件读入内存。它会以流的方式进行处理,这意味着它会分块读取源文件并写入到ZIP文件中。这对于单个大文件来说是友好的。然而,如果你同时打开了大量文件句柄,或者在处理过程中有其他内存密集型操作,仍然可能遇到内存压力。

一个非常重要的优化建议,也是一个良好的编程实践,是始终使用

with
登录后复制
语句来管理
zipfile.ZipFile
登录后复制
对象
。就像前面示例中展示的那样:

with zipfile.ZipFile(output_zip_name, 'w', zipfile.ZIP_DEFLATED) as zf:
    # ... 进行写入操作 ...
登录后复制

with
登录后复制
语句确保了无论在
try
登录后复制
块中发生什么(包括异常),
zipfile
登录后复制
对象都会被正确地关闭,释放其占用的资源,包括文件句柄和内存缓冲区。手动调用
zf.close()
登录后复制
虽然也能达到目的,但容易遗漏,特别是在错误处理分支中。
with
登录后复制
语句的自动管理机制,大大降低了资源泄漏的风险。

其次,压缩模式的选择直接影响性能。前面提到了

ZIP_DEFLATED
登录后复制
ZIP_STORED
登录后复制
。对于大型文件,如果你选择
ZIP_DEFLATED
登录后复制
,那么压缩过程会消耗更多的CPU时间。如果这些大文件本身已经是压缩格式(如视频、音频、图片),那么选择
ZIP_STORED
登录后复制
可以显著提高打包速度,因为省去了不必要的重复压缩计算。

再者,文件遍历的效率。当你压缩一个包含大量文件和深层子目录的文件夹时,

os.walk()
登录后复制
的效率通常很高,因为它是一个C语言实现的底层函数。但如果你在遍历过程中进行了额外的复杂操作(比如对每个文件进行哈希计算、内容分析等),那么这些额外操作的性能瓶颈可能会盖过
zipfile
登录后复制
本身的性能。在这种情况下,考虑是否可以并行处理文件,或者优化文件处理逻辑。

最后,对于极端的超大型文件或海量小文件

zipfile
登录后复制
模块虽然强大,但可能不是唯一或最佳选择。例如,如果文件大小达到几十GB甚至TB级别,或者需要跨网络传输,可能需要考虑更专业的流式压缩工具或分布式文件系统。但在Python的生态系统内,
zipfile
登录后复制
已经是非常成熟和高效的解决方案了,对于绝大多数日常的压缩任务,它都能很好地胜任。关键在于正确使用它的API,并遵循资源管理的最佳实践。

以上就是Python命令如何用zipfile模块创建压缩文件 Python命令文件压缩的操作指南的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号