Python压缩命令在日常的数据处理和文件管理中非常实用,尤其是在需要节省存储空间或加快文件传输速度的场景下,Python提供了多个库来实现文件和目录的压缩功能,如zipfile
、tarfile
、shutil
等,这些库支持不同的压缩格式,如ZIP、TAR、GZ、BZ2等,下面将详细介绍Python中常用的压缩命令及其使用方法,包括代码示例和注意事项。

zipfile
模块是Python中用于处理ZIP格式压缩文件的利器,它支持创建、读取、写入和追加ZIP文件,要创建一个ZIP文件并添加单个文件,可以使用以下代码:
import zipfile with zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED) as zipf: zipf.write('file1.txt', arcname='file1.txt')
这里,ZipFile
的第一个参数是目标ZIP文件名,第二个参数'w'
表示以写入模式打开,zipfile.ZIP_DEFLATED
指定使用DEFLATE压缩算法,如果需要添加整个目录,可以结合os.walk
遍历目录结构:
import os import zipfile def zip_dir(directory, zip_filename): with zipfile.ZipFile(zip_filename, 'w', zipfile.ZIP_DEFLATED) as zipf: for root, _, files in os.walk(directory): for file in files: file_path = os.path.join(root, file) arcname = os.path.relpath(file_path, start=directory) zipf.write(file_path, arcname=arcname) zip_dir('my_folder', 'my_folder.zip')
这段代码会将my_folder
目录及其所有子目录和文件压缩到my_folder.zip
中,并保持目录结构,如果需要解压ZIP文件,可以使用extractall()
方法:
with zipfile.ZipFile('example.zip', 'r') as zipf: zipf.extractall('extracted_folder')
tarfile
模块是处理TAR格式压缩文件的核心工具,TAR格式常用于Linux/Unix系统,支持与GZ、BZ2等压缩算法结合使用,创建一个.tar.gz文件:

import tarfile with tarfile.open('example.tar.gz', 'w:gz') as tar: tar.add('file1.txt', arcname='file1.txt')
这里,'w:gz'
表示以写入模式打开并使用GZ压缩,同样,可以添加整个目录:
def tar_dir(directory, tar_filename): with tarfile.open(tar_filename, 'w:gz') as tar: tar.add(directory, arcname=os.path.basename(directory)) tar_dir('my_folder', 'my_folder.tar.gz')
解压.tar.gz文件时,可以使用extractall()
:
with tarfile.open('example.tar.gz', 'r:gz') as tar: tar.extractall('extracted_folder')
除了zipfile
和tarfile
,shutil
模块也提供了便捷的压缩功能,尤其是对于整个目录的压缩,使用shutil.make_archive()
创建ZIP文件:
import shutil shutil.make_archive('my_folder', 'zip', 'my_folder')
这里,第一个参数是压缩文件名(不带扩展名),第二个参数是格式(如'zip'
、'gztar'
等),第三个参数是要压缩的目录。shutil
还支持解压,但需要结合zipfile
或tarfile
使用。

在实际应用中,选择压缩格式时需考虑兼容性和压缩率,ZIP格式跨平台兼容性好,而TAR格式在Linux系统中更常用,压缩大量小文件时,ZIP可能比TAR更高效,因为TAR需要先合并文件再压缩,以下是一个简单的压缩格式对比表:
压缩格式 | 扩展名 | 特点 | 适用场景 |
---|---|---|---|
ZIP | .zip | 跨平台,支持加密,压缩率中等 | 日常文件压缩,Windows/Linux/macOS通用 |
TAR.GZ | .tar.gz | Linux/Unix原生,压缩率高 | 服务器备份,跨平台文件传输 |
TAR.BZ2 | .tar.bz2 | 压缩率最高,但速度较慢 | 需要高压缩率的场景,如源代码分发 |
TAR.XZ | .tar.xz | 压缩率优于GZ,支持多线程 | 大文件压缩,现代Linux系统 |
在使用Python压缩命令时,需要注意以下几点:一是确保文件路径正确,避免因路径问题导致压缩失败;二是处理大文件时,建议使用分块读取或写入,避免内存溢出;三是压缩敏感数据时,应启用加密功能,如ZIP文件的zipfile.ZipFile.setpassword()
方法。
Python的压缩命令还可以结合异常处理和日志记录,以提高脚本的健壮性,捕获FileNotFoundError
并记录错误:
import logging logging.basicConfig(level=logging.INFO) try: with zipfile.ZipFile('example.zip', 'w') as zipf: zipf.write('nonexistent_file.txt') except FileNotFoundError as e: logging.error(f"文件未找到: {e}")
Python的压缩功能不仅限于本地文件,还可以结合网络操作,如压缩远程服务器文件或通过API上传压缩文件,这需要结合paramiko
(SSH)或requests
(HTTP)等库实现。
相关问答FAQs:
-
如何使用Python压缩文件时设置密码?
对于ZIP文件,可以通过zipfile.ZipFile.setpassword()
方法设置密码。with zipfile.ZipFile('secure.zip', 'w', zipfile.ZIP_DEFLATED) as zipf: zipf.setpassword(b'mypassword') # 密码需为字节类型 zipf.write('file1.txt')
解压时需提供相同密码,注意,TAR格式本身不支持加密,需结合GPG等工具实现。
-
Python压缩大文件时如何避免内存溢出?
对于大文件,建议使用分块读写,压缩大文件时逐块读取并写入ZIP:chunk_size = 1024 * 1024 # 1MB with open('large_file.txt', 'rb') as f_in, \ zipfile.ZipFile('large_file.zip', 'w') as zipf: while chunk := f_in.read(chunk_size): zipf.writestr('large_file.txt', chunk)
或者使用
shutil.copyfileobj
结合ZipFile.open()
方法优化内存使用。