专栏首页菲宇python文件压缩与解压缩

python文件压缩与解压缩

1 压缩

1.1 创建zipfile对象

zipfile.ZipFile(file, mode='r', compression=0, allowZip64=True, compresslevel=None)

创建Zipfile对象,主要参数:

1>file压缩包名称; 2>mode:读'r'或者写'w'模式; 3>compression:设置压缩格式; 4>compresslevel:压缩等级;

压缩格式分类:

格式

说明

压缩级别

ZIP_STORED

不压缩

无效

ZIP_DEFLATED

需要zlib支持

0~9

ZIP_BZIP2

需要bz2支持

0~9

ZIP_LZMA

需要lzma支持

无效

1.2 添加压缩文件

zipobj.write(self, filename, arcname=None, compress_type=None, compresslevel=None)

参数说明:

1>fiename:添加文件路径; 2>arcname:归档文件路径与名称;

1.3 添加压缩数据

zipobj.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None)

参数说明:

1>zinfo_or_arcname:归档文件名称; 2>data:压缩数据str或者byte,如果数据为str,需要先进行Utf-8编码;

1.4 关闭

关闭压缩文件:

zipobj.close()

1.5 一个例子:

压缩目录如下:

代码实现:

import zipfile logdir = '/home/linux/logs' zipname = '/home/linux/logs.zip' #创建zip对象, fzip = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) #遍历要压缩目录 flist = os.listdir(logdir) for name in flist: fpath = os.path.join(logdir, name) #写入要压缩文件 fzip.write(fpath) #关闭 fzip.close()

进入目录解压,文件路径如下:

可以看到,我们将整个目录添加到压缩文件中,其实我们更想做的是logs/*.log; 对代码进行修改:

logdir = '/home/linux/logs' zipname = '/home/linux/logs.zip' import zipfile #创建zip对象, fzip = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED) #遍历要压缩目录 flist = os.listdir(logdir) #获取压缩目录名称 basename = os.path.basename(logdir) for name in flist: fpath = os.path.join(logdir, name) arcname = os.path.join(basename, name) #写入要压缩文件,并添加归档文件名称 fzip.write(fpath, arcname=arcname) #关闭 fzip.close()

压缩之后,解压缩内容:

这个才是我们想要的。

2.获取压缩包信息

打开压缩包: frzip = zipfile.ZipFile(zipname, 'r', zipfile.ZIP_DEFLATED):只读方式打开;

frzip.printdir(),显示压缩包文件信息

File Name Modified Size logs/1003.log 2019-04-09 10:00:10 17 logs/1001.log 2019-04-09 10:00:06 17 logs/1004.log 2019-04-09 10:00:12 17 logs/1002.log 2019-04-09 10:00:08 17 logs/1000.log 2019-04-09 10:00:04 17

frzip.filelist:记录压缩包文件信息,与printdir类似,内容如下:

[<ZipInfo filename='logs/1003.log' compress_type=deflate filemode='-rw-r--r--' file_size=17 compress_size=17>, <ZipInfo filename='logs/1001.log' compress_type=deflate filemode='-rw-r--r--' file_size=17 compress_size=17>, <ZipInfo filename='logs/1004.log' compress_type=deflate filemode='-rw-r--r--' file_size=17 compress_size=17>, <ZipInfo filename='logs/1002.log' compress_type=deflate filemode='-rw-r--r--' file_size=17 compress_size=17>, <ZipInfo filename='logs/1000.log' compress_type=deflate filemode='-rw-r--r--' file_size=17 compress_size=17>]

frzip.getinfo(name):获取指定arcname的信息:

frzip.getinfo('logs/1003.log') #输出结果: <ZipInfo filename='logs/1003.log' compress_type=deflate filemode='-rw-r--r--' file_size=17 compress_size=17>

frzip.namelist():获取压缩文件列表

['logs/1003.log', 'logs/1001.log', 'logs/1004.log', 'logs/1002.log', 'logs/1000.log']

3 解压压缩包

frzip.extract(member, path=None, pwd=None):解压缩一个文件到指定目录; 参数: member:压缩包中文件; path:解压缩到指定目录,默认解压到当前目录;

frzip.extractall(path=None, members=None, pwd=None):解压缩多个文件到指定目录; 参数: path:指定的解压目录; members:指定解压文件,默认解压全部;

解压指定文件到指定目录:

#可以自己定义路径 zipname = '/home/linux/logs.zip' extractpath = '/home/linux/1' #注意压缩格式选择 frzip = zipfile.ZipFile(zipname, 'r', zipfile.ZIP_DEFLATED) extractfile = frzip.namelist() if len(extractfile): extname = extractfile[0] print('extract file:', extname) frzip.extract(extractfile[0], extractpath) frzip.close()

输出结果:extract file: logs/1003.log,在extractpath目录下有log文件;

使用frzip.extractall将所有文件解压到指定目录:

#可以自己定义路径 zipname = '/home/linux/logs.zip' extractpath = '/home/linux/1' #注意压缩格式选择 frzip = zipfile.ZipFile(zipname, 'r', zipfile.ZIP_DEFLATED) #将所有文件加压缩到指定目录 frzip.extractall(extractpath) frzip.close()

除了zipfile还有其它模块: import gzip; import tarfile;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ELKStack日志平台——Elasticsearch 6 安装与配置教程

    什么是ELK STACK: ELK Stack是Elasticserach、Logstash、Kibana三种工具组合而成的一个栈。ELK可以将我们的系统日志...

    菲宇
  • Anaconda简介、安装、环境设置

    Anaconda 是一个包含数据科学常用包的发行版本。它基于 conda(一个包和环境管理器) 衍生而来。应用程序 conda 是包和环境管理器:

    菲宇
  • 基于HAProxy+Keepalived高可用负载均衡web服务的搭建

    1.HAProxy HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy...

    菲宇
  • Power Query里的2种直接构建表的方法

    我们可以直接通过#table来构建,我们看下Power Query里对于#table的解释。

    逍遥之
  • Java 基础系列(一):基础数据类型

    今天我们来聊一下Java这门语言的数据类型,众所周知,Java是一种强类型语言。在Java中,一共有8种基本类型,其中4种整形,2种浮点类型,1种用于表示Uni...

    Vi的技术博客
  • RPA机器人流程自动化在IT服务领域的7个应用案例

    产生于上世纪90年代的ERP和共享服务,极大地提高了企业的运营效率。而2000年离岸劳动力外包业务的大力发展,则进一步降低了企业运营成本。

    蕉黄
  • 在自媒体快速发展的今天,新闻行业是否需要小程序?

    新闻行业微信小程序开发的必要性就显而易见了,因为微信小程序将是应用在中低频应用领域的,而一些小众的兴趣爱好也必将有着更多的市场,只要能够将这些零散的用户聚集起来...

    微宝阁
  • vue项目简书(一)

    1. vue数据请求完成之前的'Loading'动画, 它将给用户更好的使用体验. 这里将使用项目中的 loading 动画为例.

    生南星
  • ICML 2019 反锯齿下采样改进网络平移不变性

    前几天看到一篇来自Adobe研究院的论文《Making Convolutional Networks Shift-Invariant Again》,感觉很有启发...

    CV君
  • 系统调用和库函数的区别

    从用户的角度来看,系统调用和库函数似乎没有什么区别,它们都是以C函数的形式出现,并且两者都为应用程序提供服务。但从实现者角度来看,它们之间是有根本的区别。那么,...

    编程珠玑

扫码关注云+社区

领取腾讯云代金券