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 相关文章推荐
python各种语言间时间的转化实现代码
Mar 23 Python
python并发编程之多进程、多线程、异步和协程详解
Oct 28 Python
python使用Flask操作mysql实现登录功能
May 14 Python
将tensorflow的ckpt模型存储为npy的实例
Jul 09 Python
Pandas0.25来了千万别错过这10大好用的新功能
Aug 07 Python
python 实现绘制整齐的表格
Nov 18 Python
python绘制无向图度分布曲线示例
Nov 22 Python
python Jupyter运行时间实例过程解析
Dec 13 Python
python add_argument()用法解析
Jan 29 Python
python 安装impala包步骤
Mar 28 Python
基于python实现数组格式参数加密计算
Apr 21 Python
深入了解Python装饰器的高级用法
Aug 13 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自定义错误日志
2015/02/13 PHP
一个js实现的所谓的滑动门
2007/05/23 Javascript
jquery 触发a链接点击事件解决方案
2013/05/02 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
禁用Tab键JS代码兼容Firefox和IE
2014/04/18 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
javascript实现省市区三级联动下拉框菜单
2015/11/17 Javascript
实例详解jQuery表单验证插件validate
2016/01/18 Javascript
深入理解jquery跨域请求方法
2016/05/18 Javascript
AngularJS入门之动画
2016/07/27 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
js学习总结之dom2级事件基础知识详解
2017/07/27 Javascript
基于Vue 2.0 监听文本框内容变化及ref的使用说明介绍
2018/08/24 Javascript
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
使用Vue生成动态表单
2019/11/26 Javascript
extjs图形绘制之饼图实现方法分析
2020/03/06 Javascript
JavaScript实现与web通信的方法详解
2020/08/07 Javascript
通过实例了解Render Props回调地狱解决方案
2020/11/04 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
在Python中使用HTMLParser解析HTML的教程
2015/04/29 Python
深入浅析python继承问题
2016/05/29 Python
python保存文件方法小结
2018/07/27 Python
python实现二分类的卡方分箱示例
2019/11/22 Python
html5画布旋转效果示例
2014/01/27 HTML / CSS
美国鲜花递送:UrbanStems
2021/01/04 全球购物
《画杨桃》教学反思
2014/04/13 职场文书
计算机专业求职信
2014/06/02 职场文书
教师党员承诺书2015
2015/01/21 职场文书
报名委托书
2015/01/29 职场文书
2015年全国“爱牙日”宣传活动总结
2015/03/23 职场文书
酒店前台接待岗位职责
2015/04/02 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书