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
要使用
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
'w'
zipfile.ZIP_DEFLATED
zf.write()
arcname
立即学习“Python免费学习笔记(深入)”;
zipfile
最常用的是
zipfile.ZIP_DEFLATED
另一种模式是
zipfile.ZIP_STORED
简单来说:
ZIP_DEFLATED
ZIP_STORED
选择哪种,就看你更看重“瘦身”还是“效率”了。通常情况下,如果你不确定,
ZIP_DEFLATED
在实际应用中,我们很少只压缩一个文件。更多时候,是需要把一堆文件,甚至整个目录结构都打包进去。
zipfile
添加多个文件
如果你有一系列文件,比如一个列表,你可以简单地遍历这个列表,然后逐个添加到ZIP文件中。
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
folder_to_compress
my_project_folder
my_project_folder/src/main.py
src/main.py
my_project_folder/src/main.py
当处理非常大的文件或大量文件时,
zipfile
首先,内存使用是一个需要关注的点。
zipfile
一个非常重要的优化建议,也是一个良好的编程实践,是始终使用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
ZIP_STORED
再者,文件遍历的效率。当你压缩一个包含大量文件和深层子目录的文件夹时,
os.walk()
zipfile
最后,对于极端的超大型文件或海量小文件,
zipfile
zipfile
以上就是Python命令如何用zipfile模块创建压缩文件 Python命令文件压缩的操作指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号