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_Python zipfile模块学习相关推荐

  1. python zipfile_python zipfile模块学习笔记(一)

    ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建.读取.写入.附加和列出一个ZIP文件.使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程 ...

  2. python zipfile_python zipfile模块

    从简单的角度来看的话,zip格式会是个不错的选择,而且python对zip格式的支持够简单,够好用. 1)简单应用 如果你仅仅是希望用python来做压缩和解压缩,那么就不用去翻文档了,这里提供一个简 ...

  3. 使用python的zipfile模块巧解word批量生成问题

    使用python的zipfile模块巧解word批量生成问题 任务需求 任务拆解 任务方案 方案一:使用python-docx.Document读取word文档 方案二:zipfile巧解word文档 ...

  4. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  5. python之wxpython模块学习

    python之wxpython模块学习 wxPython简介 创建一个GUI程序 wxPython简介 wxPython 是一个用于 wxWidgets (用C ++编写)的Python包装器,这是一 ...

  6. python zipfile模块学习笔记(一)

    ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建.读取.写入.附加和列出一个ZIP文件.使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程 ...

  7. python zipfile_python zipfile - 刘江的python教程

    zipfile 阅读: 12164 评论:0 ZIP是通用的归档和压缩格式.zipfile模块提供了通用的创建.读取.写入.附加和显示压缩文件的方法,你可以简单地把它理解为Python中的zip解压缩 ...

  8. 【正则表达式】正则表达式及python的re模块学习

    以前经常听正则表达式,但自己从来没用过,这次刚好需要,就学习一下. 参考链接: https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb ...

  9. Python网络协议模块学习之smtplib

    功能:smtplib模块是通过邮件服务器发送电子邮件,是smtp客户端的实现,支持邮件格式有:文本.HTML.Image.EXCEL等. 1.普通文本邮件 1 2 3 4 5 6 7 8 9 10 1 ...

最新文章

  1. 常用排序算法 - 稳定性和复杂度分析
  2. 模拟调频信号FM解调的matlab和C语言实现
  3. 误删了计算机桌面回收站,我电脑回收站里的东西已经被删除几天了?怎么可以找回!谢谢...
  4. jq之无callback,有 alert hide
  5. kohana的modules集合
  6. spss回归分析_SPSS之回归分析
  7. wpe手机中文汉化版下载_wpe中文版
  8. pnp型三极管 饱和 截至_截至2013年核心Java帖子
  9. 从留言板开始做网站(三)——CSS样式代码
  10. 如何自制圆环_PPT中如何制作环形图高级教程
  11. html添加启动项,windows boot manager启动项是什么
  12. c语言中中不同类型数据间的混合运算
  13. Java游戏项目之黄金矿工
  14. 华为云服务器linux部署项目简单步骤小结(超级详细)
  15. C++后端开发学习路线及推荐学习时间
  16. [UOJ#454][UER#8]打雪仗
  17. 调用科大讯飞语音合成离线SDK的基础上调用pyqt5模块编写gui界面
  18. uni-app使用Hbuilder X如何安卓APP打包、发布、运行
  19. java计算机毕业设计springboot+vue学生宿舍管理系统
  20. Linux下修改Oracle字符集为ZHS16GBK

热门文章

  1. 苹果手机html5摇一摇游戏戏码,HTML5摇一摇(下)—如何实现签筒摇动动画
  2. C++中单例模式的总结——operater new private construct
  3. linux下端口镜像,Linux如何实现镜像端口
  4. Windows azure Web 应用程序代理服务器—ADFS的extranet访问权限
  5. 天创速盈:如何提高拼多多的活动价格?
  6. rust编程:let和mut的变量和可变性
  7. TCP/IP 协议族 And HTTP 协议 基基基础知识
  8. signature=53e00ec565523fa0cea26fd5d380afdd, Geochemistry and Nd isotopes of the François La...
  9. 数据库题目 - 查找重复的电子邮箱
  10. 微信小程序 解析XML中缺失函数的判断