转载自https://www.j4ml.com/t/15270

import zipfile
import os
from zipfile import ZipFile class ZipManage(ZipFile): def check(self, Name):
# 检查 文件指针是否有效
if self.fp == '':
raise RuntimeError('ZIP archive is closed')
# 检查 文件是否用 append 模式打开
if self.mode != 'a':
raise RuntimeError('ZIP archive Requires appended("a") mode to open')
# 检查 文件或文件夹 是否在zip中
is_existed = False
for FileName in self.filelist:
if FileName.filename.startswith(Name):
is_existed = True;
break; if is_existed == False:
raise RuntimeError('ZIP archive not found ', Name) # 删除zip包中的文件
def remove(self, szFileName):
self.check(szFileName) # 获取 要删除文件在zip中的信息
fileinfo = self.getinfo(szFileName)
print(type(fileinfo)) headerOffSet = fileinfo.header_offset
fileBlockLen = len(fileinfo.FileHeader()) + fileinfo.compress_size # 根据要删除的文件信息, 更新zip包中其他文件的头部偏移值
for info in self.infolist():
if info.header_offset >= (headerOffSet + fileBlockLen):
info.header_offset -= fileBlockLen # 将文件指针移动到 待删除文件的末尾
self.fp.seek(headerOffSet + fileBlockLen) # 读取 zip中 待删除文件后 的全部数据
data = self.fp.read() # 移动文件指针到 待删除文件的开始
self.fp.seek(headerOffSet) # 覆写数据
self.fp.write(data) # 截断文件
self.fp.truncate() # 更新 zip 中的文件索引信息
self._didModify = True
self.filelist.remove(fileinfo)
del self.NameToInfo[fileinfo.filename] # 删除 zip 中文件夹
def remove_dir(self, szDirName):
self.check(szDirName) # 获取 要删除文件夹在zip中的信息
dirInfo = self.getinfo(szDirName) # 获取 头部信息 和 文件块的大小
headerOffSet = dirInfo.header_offset
fileBlockLen = 0
for file in self.infolist():
if file.filename.startswith(szDirName):
fileBlockLen += (len(file.FileHeader()) + file.compress_size) for file_head_info in self.infolist():
if file_head_info.header_offset >= (headerOffSet + fileBlockLen):
file_head_info.header_offset -= fileBlockLen # 将文件指针移动到 待删除文件的末尾
self.fp.seek(headerOffSet + fileBlockLen) # 读取 zip中 待删除文件后 的全部数据
latedata = self.fp.read() # 移动文件指针到 待删除文件的开始
self.fp.seek(headerOffSet) # 覆写数据
self.fp.write(latedata) # 截断文件
self.fp.truncate() # 更新 zip 中的文件索引信息
self._didModify = True # 反向迭代删除
for i in range(len(self.infolist())-1, -1, -1):
info = self.infolist()[i]
if info.filename.startswith(szDirName):
self.filelist.remove(info)
del self.NameToInfo[info.filename] # 替换 zip 文件中的信息
def replace(self, szReplaceFilename, szNewFilePath):
self.check(szReplaceFilename) if not os.path.exists(szNewFilePath):
print(szNewFilePath,' is not existed')
return; fileinfo = self.getinfo(szReplaceFilename)
self.remove(szReplaceFilename)
self.write(szNewFilePath,fileinfo.filename,fileinfo.compress_type) def test_remove():
file = ZipManage('/home/s/Desktop/1.zip', 'a')
file.remove('1/1/2/22/test.txt') def test_remove_dir():
file = ZipManage('/home/s/Desktop/1.zip', 'a')
file.remove_dir('1/1/2/22/') def test_replace():
file = ZipManage('/home/s/Desktop/1.zip', 'a')
file.replace('1/1/test.txt', '/home/s/Desktop/test.txt')

Python zipfile模块学习的更多相关文章

  1. python - argparse 模块学习

    python - argparse 模块学习 设置一个解析器 使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数.那么当你的程序运行时,该解析器就可以用于处理命令行参数. 解 ...

  2. Python ZipFile模块详解(转)

    Python zipfile模块用来做zip格式编码的压缩和解压缩的,zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个cl ...

  3. python paramiko模块学习分享

    python paramiko模块学习分享 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.paramiko支持Linux, Sola ...

  4. Python logging 模块学习

    logging example Level When it's used Numeric value DEBUG Detailed information, typically of interest ...

  5. Python time模块学习

    Python time模块提供了一些用于管理时间和日期的C库函数,由于它绑定到底层C实现,因此一些细节会基于具体的平台. 一.壁挂钟时间 1.time() time模块的核心函数time(),它返回纪 ...

  6. python os模块学习

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的. 二.常用方法 1.os.name 输出字符串指示正在使用的平台.如果是wi ...

  7. python logging模块学习(转)

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  8. python atexit模块学习

    python atexit模块 只定义了一个register模块用于注册程序退出时的回调函数,我们可以在这个函数中做一下资源清理的操作 注:如果程序是非正常crash,或者通过os._exit()退出 ...

  9. Python 第二模块学习总结

    学习总结: 1.掌握对装饰器的用法 2.掌握生成器的用法 3.掌握迭代器的用法 4.熟悉Python内置函数 5.熟悉Python shutil/shelve/configparse/hashlib/ ...

随机推荐

  1. 一文了解服务端推送(含JS代码示例)

    常用的服务端推送技术,包括轮询.长轮询.websocket.server-sent-event(SSE) 传统的HTTP请求是由客户端发送一个request,服务端返回对应response,所以当服务 ...

  2. Mybatis总结一之Mybatis项目的创建

    一.mybatis概念 Mybatis是对象和表之间映射关系的持久层框架. 二.Mybatis的导入与创建 第一步,创建web项目,引入mybatis依赖的jar包----mybatis-3.4.6. ...

  3. Fiddler3 使用技巧

    1.Fiddler抓不到包怎么解决 (1)先确定是HTTP包抓不到还是HTTPS包抓不到.如果只是HTTPS包抓不到,说明是证书的问题,需要重新安装证书. (2)检查浏览器的HTTP代理设置是否正确, ...

  4. Journal of Proteome Research | Current understanding of human metaproteome association and modulation(人类宏蛋白质组研究近期综述)(解读人:李巧珍)

    文献名:Current understanding of human metaproteome association and modulation(人类宏蛋白质组研究近期综述) 期刊名:J Prot ...

  5. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

  6. Python第五章-内置数据结构05-集合

    Python内置数据结构 五.集合(set) python 还提供了另外一种数据类型:set. set用于包含一组无序的不重复对象.所以set中的元素有点像dict的key.这是set与 list的最 ...

  7. Python第一章-编码规范

    Python的基础知识 一.编码规范 PEP8[^ 注] 编码规范 Guido的关键点之一是:代码更多是用来读而不是写.编码规范旨在改善Python代码的可读性. 风格指南强调一致性.项目.模块或函数 ...

  8. spring-cloud-gateway过滤器实践

    概述 这里是 SpringCloud Gateway 实践的第一篇,主要讲过滤器的相关实现.Spring-Cloud-Gateway 是以 WebFlux 为基础的响应式架构设计, 是异步非阻塞式的, ...

  9. Python Seaborn综合指南,成为数据可视化专家

    概述 Seaborn是Python流行的数据可视化库 Seaborn结合了美学和技术,这是数据科学项目中的两个关键要素 了解其Seaborn作原理以及使用它生成的不同的图表 介绍 一个精心设计的可视化 ...

  10. 2020年最新版Web前端学习路线图-前端小白入门必读-pink老师推荐

    Hello,大家好,相信很多学习前端的小伙伴,会有很多的疑惑: 我要学习那些技术? 我要到哪里去学习这些技术呢? 学习这些技术的目的对就业有什么帮助呢? 我学到什么程度可以胜任工作? ... 这里,p ...