news 2026/5/1 0:49:46

Python 压缩文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 压缩文件

1. 标准库中的压缩模块

在我们常用的系统WindowsLinux系统中有很多支持的压缩包格式,包括但不限于以下种类:rarziptar,以下的标准库的作用就是用于压缩解压缩其中一些格式的压缩包。

2. zipfile

zipfile模块操作压缩包使用ZipFile类进行操作,使用方法和open的使用方法很相似,也是使用rwxa四种操作模式。基本步骤也是大致分为三步:打开文件、操作文件、关闭文件。可以使用with语法进行上下文自动操作。

注意一:zipfile也是rwxa四种模式,表示也会有文件操作中光标指针的概念。

注意二:在Python中,几乎所有涉及到文件相关的操作都是打开、操作、关闭三个步骤。

ZipFile参数说明

语法:ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)

参数含义
file文件路径
mode操作含义,与文件操作中相同,默认为r。
compression压缩方法,默认为ZIP_STORED。
allowZip64操作的压缩包文件大小大于2G时应该True,默认为True,不用管它。

操作含义

模式含义
w创建一个新的压缩包文件。
r读取已有的压缩包文件。
a向已有的压缩包文件中压缩文件。

压缩方法

在上面的compression参数中可以看到,默认的压缩方法为ZIP_STORED。其实在zipfile模块中定义了一些压缩方法常量,其中最常用的为以下两种:

ZIP_STORED = 0 # 打包归档(不压缩) ZIP_DEFLATED = 8 # 压缩文件(压缩)

注意,压缩方法指的是将文件写入压缩包中采用的方法,所以,如果是解压缩文件,就没必要指定这个压缩方法了。

2.1. 压缩单个文件

from zipfile import ZipFile with ZipFile('output.zip', 'w') as z: z.write('input.txt')

2.2. 压缩多个文件

要求:

  • 将多个文件压缩后,处于同一目录下(也就是 zip 文件中,不包含子目录结构)
  • 这些源文件可能来自不同的目录
from os.path import basename from zipfile import ZipFile def zip_files(*files): with ZipFile('output.zip', 'w') as z: for f in files: z.write(f, arcname=basename(f))

2.3. 压缩单个目录

压缩单个目录时,ZipFile 需要 write 目录,以及目录下每一个文件(包括子文件夹的文件)的路径。

这些路径在 zip 文件中有一个公共的前缀,也就是根目录的目录名,如下所示:

output.zip
|= root # 这是公共的前缀
|- aaa.txt
|- bbb.txt
|= ccc
|- ddd.txt

import os import os.path from zipfile import ZipFile def zip_dir(dir_): with ZipFile('output.zip', 'w') as z: z.write(dir_, arcname=(dn := os.path.basename(dir_))) for root, dirs, files in os.walk(dir_): for fn in files: z.write( fp := os.path.join(root, fn), arcname=dn + '/' + os.path.relpath(fp, dir_) # ^^^^^^^^^^ 特别注意这里. )

2.4. 压缩多个目录

要求:取它们的公共路径部分作为前缀。

输入:

c:
|= aaa
|= mmm
|- foo.txt
|= nnn
|- bar.txt

输出:

result.zip
|= mmm
|- foo.txt
|= nnn
|- bar.txt

import os import os.path from zipfile import ZipFile def zip_dirs(*dirs): prefix = os.path.commonprefix(dirs) with ZipFile('output.zip', 'w') as z: for d in dirs: z.write(d, arcname=os.path.relpath(d, prefix)) for root, dirs, files in os.walk(d): for fn in files: z.write( fp := os.path.join(root, fn), arcname=os.path.relpath(fp, prefix) )

2.5. 脚本

我将上述片段合并到一个脚本里面了,名称为“ziputil.py”,代码如下:

import os import os.path from zipfile import ZipFile def zip_file(file_i: str, file_o: str) -> None: with ZipFile(file_o, 'w') as z: z.write(file_i, arcname=(n := os.path.basename(file_i))) print('zip_file:', n) def zip_files(*files_i: str, file_o: str) -> None: with ZipFile(file_o, 'w') as z: for f in files_i: z.write(f, arcname=(n := os.path.basename(f))) print('zip_files:', n) def zip_dir(dir_i: str, file_o: str) -> None: dir_i_parent = os.path.dirname(dir_i) with ZipFile(file_o, 'w') as z: z.write(dir_i, arcname=(n := os.path.basename(dir_i))) print('zip_dir:', n) for root, dirs, files in os.walk(dir_i): for fn in files: z.write( fp := os.path.join(root, fn), arcname=(n := os.path.relpath(fp, dir_i_parent)), ) print('zip_dir:', n) def zip_dirs(*dirs_i: str, file_o: str) -> None: prefix = os.path.commonprefix(dirs_i) with ZipFile(file_o, 'w') as z: for d in dirs_i: z.write(d, arcname=(n := os.path.relpath(d, prefix))) print('zip_dirs:', n) for root, dirs, files in os.walk(d): for fn in files: z.write( fp := os.path.join(root, fn), arcname=(n := os.path.relpath(fp, prefix)), ) print('zip_dirs:', n)

2.6. 实战(截图)

3. tarfile

tarfile的使用和文件操作更加的相似,只是在压缩模式上略有不同。

使用Linux系统的朋友都知道,tar是Linux的一种打包方式,打包成为tar包之后,才可以使用其它的压缩程序去压缩。最常用的压缩方式是gzip,压缩率最高的方式bzip2,此外还支持另一种比较小众的xzip格式。

主要操作方法为tarfile.TarFile.open(),可以直接tarfile.open()

语法:open(name, mode='r')

当初在学习的时候,老师还教有encoding='UTF-8'参数,但是文件操作要什么编码格式?感觉他是为了方便直接从文件操作的代码上直接复制过来的,然后没有删掉。

操作tar包

模式为rwax四种为主,外加使用add方法写入文件,退出依然使用close方法。

add(name, arcname)

add(压缩文件,压缩别名)

注意,压缩别名一定不要以路径分隔符为结尾,否则只会创建一个文件夹。

import tarfile with tarfile.open('test.tar', 'w') as tf: tf.add('test.txt')

压缩

压缩的方式主要是将模式改变,在rwx的基础上加上各个压缩的方式,变成:r:gzw:bz2x:xz等样式,然后在将刚才创建的tar包压缩,当然也可以直接将文件压缩成为压缩包。

注意,a模式不能配备任何压缩模式,因为gzip、bzip2、xzip不能直接往里面追加文件,所以如果要追加文件,将tar包解压缩出来,然后追加再压缩。

import tarfile # tar包以gzip格式压缩 with tarfile.open('test.tar.gz', 'w:gz') as tf: tf.add('test.tar')

解压缩

tarfile的解压缩方法和zipfile的一模一样。

方法含义
extract解压缩指定文件
extractall解压缩所有文件

getnames -- 返回压缩包中的文件(list)

删除压缩包中的文件

zipfile和tarfile不支持删除压缩包中的文件,所以如果有需要删除压缩包中的文件,可以将压缩包解压出来,然后删除其中的文件,再压缩。

参考文献

https://www.cnblogs.com/msr20666/p/16377769.html

Python 标准库 zipfile 压缩文件/文件夹_python压缩文件夹为zip_Likianta Me的博客-CSDN博客

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 0:46:39

从‘保存文件’到硬盘闪烁:一次点击背后的四层软件接力赛

从‘保存文件’到硬盘闪烁:一次点击背后的四层软件接力赛 当你点击Word文档的保存按钮时,屏幕上瞬间闪现的"保存成功"提示和硬盘指示灯明灭的闪烁,背后其实是一场精密的软件接力赛。这场跨越四个层级的协作,将你的操作指…

作者头像 李华
网站建设 2026/4/16 2:11:40

[RDK X5][001]初见地瓜机器人RDK X5:配置与简单测试

目录 一、SD卡烧录 二、远程连接 2.1 串口连接 2.2 WiFi连接 2.3 SSH连接 三、环境配置 3.1 VNC Server配置 3.1.1 VNC密码配置 3.1.2 VNC自启动 3.1.3 VNC远程连接 3.1.4 卡顿问题 3.2 ROS2安装 四、程序测试 4.1 小海龟仿真 4.2 相机启动和图像获取 五、常用…

作者头像 李华
网站建设 2026/4/16 0:43:44

GD32F103实战:SPI+DMA高效数据搬运配置详解

1. 为什么需要SPIDMA? 在嵌入式开发中,SPI(Serial Peripheral Interface)是最常用的高速通信接口之一,常用于连接Flash、显示屏、传感器等外设。但传统的SPI轮询或中断方式有个致命问题:每传输一个字节都需…

作者头像 李华