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中__slots__用法实例
Jun 04 Python
Python实现Mysql数据库连接池实例详解
Apr 11 Python
Django如何实现内容缓存示例详解
Sep 24 Python
Python编写Windows Service服务程序
Jan 04 Python
详解Python中的动态属性和特性
Apr 07 Python
python删除文本中行数标签的方法
May 31 Python
Python实现字典排序、按照list中字典的某个key排序的方法示例
Dec 18 Python
python使用threading.Condition交替打印两个字符
May 07 Python
Python替换月份为英文缩写的实现方法
Jul 15 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
Python迭代器Iterable判断方法解析
Mar 16 Python
python语言是免费还是收费的?
Jun 15 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中截取字符串支持utf-8
2007/01/18 PHP
php实现的MySQL通用查询程序
2007/03/11 PHP
ajax+php打造进度条 readyState各状态
2010/03/20 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
jquery模拟实现鼠标指针停止运动事件
2016/01/12 Javascript
JavaScript小技巧整理篇(非常全)
2016/01/26 Javascript
深入分析node.js的异步API和其局限性
2016/09/05 Javascript
JS之相等操作符详解
2016/09/13 Javascript
谈谈因Vue.js引发关于getter和setter的思考
2016/12/02 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
详解vue2 $watch要注意的问题
2017/09/08 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
Python Charles抓包配置实现流程图解
2020/09/29 Python
Python文件操作及内置函数flush原理解析
2020/10/13 Python
Django中日期时间型字段进行年月日时分秒分组统计
2020/11/27 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
css3.0 图形构成实例练习一
2013/03/19 HTML / CSS
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
2013/01/06 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
2020/02/05 HTML / CSS
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
给交警的表扬信
2014/01/12 职场文书
读书之星事迹材料
2014/05/12 职场文书
中华魂演讲稿
2014/05/13 职场文书
经销商年会策划方案
2014/05/29 职场文书
欢送领导祝酒词
2015/08/12 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android