Python实现压缩和解压缩ZIP文件的方法分析


Posted in Python onSeptember 28, 2017

本文实例讲述了Python实现压缩和解压缩ZIP文件的方法。分享给大家供大家参考,具体如下:

有时我们需要在 Python 中使用 zip 文件,而在1.6版中,Python 就已经提供了 zipfile 模块可以进行这样的操作。不过 Python 中的 zipfile 模块不能处理多卷的情况,不过这种情况并不多见,因此在通常情况下已经足够使用了。下面我只是对一些基本的 zipfile 操作进行了记录,足以应付大部分的情况了。

zipfile 模块可以让你打开或写入一个 zip 文件。比如:

import zipfile
z = zipfile.ZipFile('zipfilename', mode='r')

这样就打开了一个 zip 文件,如果mode为'w'或'a'则表示要写入一个 zip 文件。如果是写入,则还可以跟上第三个参数:

compression=zipfile.ZIP_DEFLATED 或compression=zipfile.ZIP_STORED ZIP_DEFLATED是压缩标志,如果使用它需要编译了zlib模块。而后一个只是用zip进行打包,并不压缩。

在打开了zip文件之后就可以根据需要是读出zip文件的内容还是将内容保存到 zip 文件中。

读出zip中的内容

很简单,zipfile 对象提供了一个read(name)的方法。name为 zip文件中的一个文件入口,执行完成之后,将返回读出的内容,你把它保存到想到的文件中即可。

写入zip文件

有两种方式,一种是直接写入一个已经存在的文件,另一种是写入一个字符串。

对 于第一种使用 zipfile 对象的 write(filename, arcname, compress_type),后两个参数是可以忽略的。第一个参数是文件名,第二个参数是表示在 zip 文件中的名字,如果没有给出,表示使用与filename一样的名字。compress_type是压缩标志,它可以覆盖创建 zipfile 时的参数。第二种是使用 zipfile 对象的 writestr(zinfo_or_arcname, bytes),第一个参数是zipinfo 对象或写到压缩文件中的压缩名,第二个参数是字符串。使用这个方法可以动态的组织文件的内容。

需要注意的是在读出时,因为只能读出内容,因此如果想实现按目录结构展开 zip 文件的话,这些操作需要自已来完成,比如创建目录,创建文件并写入。而写入时,则可以根据需要动态组织在 zip 文件中的目录结构,这样可以不按照原来的目录结构来生成 zip 文件。

于是我为了方便使用,创建了自已的一个 ZFile 类,主要是实现象 winrar 的右键菜单中的压缩到的功能--即将一个zip文件压缩到指定目录,自动创建相应的子目录。再有就是方便生成 zip 文件。类源码为:

# coding:cp936
# Zfile.py
# xxteach.com
import zipfile
import os.path
import os
class ZFile(object):
  def __init__(self, filename, mode='r', basedir=''):
    self.filename = filename
    self.mode = mode
    if self.mode in ('w', 'a'):
      self.zfile = zipfile.ZipFile(filename, self.mode, compression=zipfile.ZIP_DEFLATED)
    else:
      self.zfile = zipfile.ZipFile(filename, self.mode)
    self.basedir = basedir
    if not self.basedir:
      self.basedir = os.path.dirname(filename)
  def addfile(self, path, arcname=None):
    path = path.replace('//', '/')
    if not arcname:
      if path.startswith(self.basedir):
        arcname = path[len(self.basedir):]
      else:
        arcname = ''
    self.zfile.write(path, arcname)
  def addfiles(self, paths):
    for path in paths:
      if isinstance(path, tuple):
        self.addfile(*path)
      else:
        self.addfile(path)
  def close(self):
    self.zfile.close()
  def extract_to(self, path):
    for p in self.zfile.namelist():
      self.extract(p, path)
  def extract(self, filename, path):
    if not filename.endswith('/'):
      f = os.path.join(path, filename)
      dir = os.path.dirname(f)
      if not os.path.exists(dir):
        os.makedirs(dir)
      file(f, 'wb').write(self.zfile.read(filename))
def create(zfile, files):
  z = ZFile(zfile, 'w')
  z.addfiles(files)
  z.close()
def extract(zfile, path):
  z = ZFile(zfile)
  z.extract_to(path)
  z.close()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
jupyter安装小结
Mar 13 Python
python中子类继承父类的__init__方法实例
Dec 15 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
Python实现模拟分割大文件及多线程处理的方法
Oct 10 Python
Python数据可视化正态分布简单分析及实现代码
Dec 04 Python
python装饰器深入学习
Apr 06 Python
12个步骤教你理解Python装饰器
Jul 01 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
python实现拼图小游戏
Feb 22 Python
django实现模型字段动态choice的操作
Apr 01 Python
详解在OpenCV中如何使用图像像素
Mar 03 Python
Python有序字典简单实现方法示例
Sep 28 #Python
python操作MySQL 模拟简单银行转账操作
Sep 27 #Python
python利用urllib和urllib2访问http的GET/POST详解
Sep 27 #Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 #Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 #Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 #Python
Python基于分水岭算法解决走迷宫游戏示例
Sep 26 #Python
You might like
php excel reader读取excel内容存入数据库实现代码
2012/12/06 PHP
浅谈php处理后端&接口访问超时的解决方法
2016/10/29 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
jQuery中hasClass()方法用法实例
2015/01/06 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
认识Knockout及如何使用Knockout绑定上下文
2015/12/25 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
基于vue2.0实现的级联选择器
2017/06/09 Javascript
详细分析jsonp的原理和实现方式
2017/11/20 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
2018/08/25 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
JS实现小米轮播图
2020/09/21 Javascript
vue+element实现动态加载表单
2020/12/13 Vue.js
详解python之多进程和进程池(Processing库)
2017/06/09 Python
在python中实现同行输入/接收多个数据的示例
2019/07/20 Python
如何通过python实现人脸识别验证
2020/01/17 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
Python 创建TCP服务器的方法
2020/07/28 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
2020/09/28 Python
5分钟快速掌握Python定时任务框架的实现
2021/01/26 Python
爱尔兰领先的在线体育用品零售商:theGAAstore
2018/04/16 全球购物
Lentiamo比利时:便宜的隐形眼镜
2020/02/14 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
招聘与培训专员岗位职责
2014/01/30 职场文书
总经理助理的职责
2014/03/14 职场文书
服务明星事迹材料
2014/12/29 职场文书
通知的写法
2015/04/23 职场文书
2015年七年级班主任工作总结
2015/05/21 职场文书
外科护士长工作总结
2015/08/12 职场文书
2016年习总书记讲话学习心得体会
2016/01/20 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
阿里云服务器Ubuntu 20.04上安装Odoo 15
2022/05/20 Servers