0

0

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

看不見的法師

看不見的法師

发布时间:2025-08-13 16:29:01

|

232人浏览过

|

来源于php中文网

原创

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文件中。

PathFinder
PathFinder

AI驱动的销售漏斗分析工具

下载
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,并遵循资源管理的最佳实践。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

410

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

638

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

362

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

263

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

631

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

671

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

618

2023.09.22

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.5万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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