Python中zipfile压缩包模块的使用


Posted in Python onMay 14, 2021

简介

ZIP 文件格式是一个常用的归档与压缩标准,zipfile 模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具

此模块目前不能处理分卷 ZIP 文件,支持解密 ZIP 归档中的加密文件,但是目前不能创建一个加密的文件。解密非常慢,因为它是使用原生 Python 而不是 C 实现的

压缩文件

class zipfile.ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, compresslevel=None, *, strict_timestamps=True):ZipFile 对象,compression指定压缩模式

ZipFile.write(filename, arcname=None, compress_type=None, compresslevel=None):写入压缩文件,filename为原文件名,arcname为存档文件名,compress_type指定压缩模式

 

压缩模式 含义
ZIP_STORED 不压缩,默认值
ZIP_DEFLATED 常用的 ZIP 压缩
ZIP_BZIP2 BZIP2 压缩
ZIP_LZMA LZMA 压缩
import random
import zipfile

with open('1.txt', mode='w') as f:
    for _ in range(1000):
        f.write(str(random.random()) + '\n')

with zipfile.ZipFile('1.zip', mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
    zf.write('1.txt')
    zf.write('1.txt', '2.txt', zipfile.ZIP_STORED)  # 原文件名1.txt,存为2.txt,不压缩

效果

Python中zipfile压缩包模块的使用

解压文件

ZipFile.namelist():返回按名称排序的文件列表

ZipFile.extract(member, path=None, pwd=None):解压文件到指定目录

import zipfile

with zipfile.ZipFile('1.zip') as zf:
    for filename in zf.namelist():
        zf.extract(filename, '.')

是否ZIP文件

调用 zipfile.is_zipfile(filename)

是一个有效的 ZIP 文件返回 True,否则返回 False,压根不存在返回 False

import zipfile

for filename in ['1.txt', '1.zip', '2.zip']:
    print(filename, zipfile.is_zipfile(filename))
    # 1.txt False
    # 1.zip True
    # 2.zip False

读取元数据

ZipFile.namelist():返回按名称排序的文件列表

ZipFile.infolist():返回ZipInfo对象 列表

ZipFile.getinfo(name):返回一个 ZipInfo对象

import zipfile

with zipfile.ZipFile('1.zip', 'r') as zf:
    print(zf.namelist())  # 文件列表

    for info in zf.infolist():
        print(info)
        print(info.filename)  # 文件名称
        print(info.date_time)  # 修改时间,可用datetime.datetime(*info.date_time)
        print(info.compress_type)  # 压缩类型,值为zipfile.ZIP_STORED、ZIP_DEFLATED、ZIP_BZIP2、ZIP_LZMA
        print(info.comment)  # 注释
        print(info.extra)  # 扩展字段数据
        print(info.create_system)  # 创建所用系统,0为Windows,3为Unix
        print(info.create_version)  # 创建所用PKZIP版本
        print(info.extract_version)  # 提取所用PKZIP版本
        print(info.flag_bits)  # 标志位
        print(info.volume)  # 文件头的分卷号
        print(info.compress_size)  # 已压缩的数据大小
        print(info.file_size)  # 未压缩的数据大小
        print()

从其他数据源压缩文件

ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, compresslevel=None):将一个文件写入压缩文件

import random
import zipfile

data = ''.join([str(random.random()) + '\n' for i in range(1000)])

with zipfile.ZipFile('1.zip', mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
    zf.writestr('1.txt', data)

写入ZipInfo

class zipfile.ZipInfo(filename='NoName', date_time=(1980, 1, 1, 0, 0, 0)):压缩文件成员信息类

import time
import random
import zipfile

data = ''.join([str(random.random()) + '\n' for i in range(1000)])

with zipfile.ZipFile('1.zip', mode='w', compression=zipfile.ZIP_DEFLATED) as zf:
    info = zipfile.ZipInfo('1.txt', date_time=time.localtime(time.time()))
    info.compress_type = zipfile.ZIP_DEFLATED
    info.comment = b'a comment'
    info.create_system = 0
    zf.writestr(info, data)

效果

Python中zipfile压缩包模块的使用

追加文件

ZipFilemode 改为追加模式 a

import random
import zipfile

with open('2.txt', mode='w') as f:
    for _ in range(1000):
        f.write(str(random.random()) + '\n')

with zipfile.ZipFile('1.zip', mode='a') as zf:
    zf.write('2.txt')

创建包含Python库的ZIP

class zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1):用于创建包含 Python 库的 ZIP 类

zipfile_pyzipfile.py

import sys
import zipfile

with zipfile.PyZipFile('pyzipfile.zip', mode='w') as zf:
    zf.debug = 3
    zf.writepy('.')
for name in zf.namelist():
    print(name)

sys.path.insert(0, 'pyzipfile.zip')
import zipfile_pyzipfile

print('Imported from:', zipfile_pyzipfile.__file__)

参考文献

zipfile — Python文档

zipfile — PyMOTW 3

到此这篇关于Python中zipfile压缩包模块的使用的文章就介绍到这了,更多相关Python zipfile内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python读文件逐行处理的示例代码分享
Dec 27 Python
python实现进程间通信简单实例
Jul 23 Python
python3+requests接口自动化session操作方法
Oct 13 Python
Python模块汇总(常用第三方库)
Oct 07 Python
python实现智能语音天气预报
Dec 02 Python
python+OpenCV实现图像拼接
Mar 05 Python
python 解决Fatal error in launcher:错误问题
May 21 Python
使用Pycharm在运行过程中,查看每个变量的操作(show variables)
Jun 08 Python
基于python实现判断字符串是否数字算法
Jul 10 Python
只需要100行Python代码就可以实现的贪吃蛇小游戏
May 27 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 Python
深入理解Pytorch微调torchvision模型
Nov 11 Python
python 制作一个gui界面的翻译工具
pyqt5打包成exe可执行文件的方法
Python 机器学习工具包SKlearn的安装与使用
python process模块的使用简介
May 14 #Python
django学习之ajax post传参的2种格式实例
May 14 #Python
Python djanjo之csrf防跨站攻击实验过程
python控制台打印log输出重复的解决方法
You might like
PHP执行linux系统命令的常用函数使用说明
2010/04/27 PHP
PHP命名空间(Namespace)简明教程
2014/06/11 PHP
一个经典的PHP验证码类分享
2014/11/18 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
php菜单/评论数据递归分级算法的实现方法
2019/08/01 PHP
JavaScript 编程引入命名空间的方法与代码
2007/08/13 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
js里取容器大小、定位、距离等属性搜集整理
2013/08/19 Javascript
jQuery避免$符和其他JS库冲突的方法对比
2014/02/20 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
前端自动化开发之Node.js的环境搭建教程
2017/04/01 Javascript
vue-cli单页应用改成多页应用配置详解
2017/07/14 Javascript
vue.js前后端数据交互之提交数据操作详解
2018/04/24 Javascript
Vue中使用webpack别名的方法实例详解
2018/06/19 Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
2018/06/28 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
用python与文件进行交互的方法
2018/03/01 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
python读写配置文件操作示例
2019/07/03 Python
Python命令行click参数用法解析
2019/12/19 Python
查看keras各种网络结构各层的名字方式
2020/06/11 Python
CSS3中Color的一些特性介绍
2012/05/27 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
莫斯科高科技在线商店:KremlinStore
2019/03/13 全球购物
法国滑雪假期的专家:Ski Planet
2019/11/02 全球购物
社区庆八一活动方案
2014/02/02 职场文书
社团2014年植树节活动总结
2014/03/11 职场文书
小学生十佳少年事迹材料
2014/08/20 职场文书
Python入门之基础语法详解
2021/05/11 Python
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL