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文件读写操作与linux shell变量命令交互执行的方法
Jan 14 Python
Python 的 Socket 编程
Mar 24 Python
python字典排序实例详解
May 20 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
python列表生成式与列表生成器的使用
Feb 23 Python
python 读取目录下csv文件并绘制曲线v111的方法
Jul 06 Python
python 反向输出字符串的方法
Jul 16 Python
Python 实现微信防撤回功能
Apr 29 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
python实现AHP算法的方法实例(层次分析法)
Sep 09 Python
如何使用python写截屏小工具
Sep 29 Python
Django多个app urls配置代码实例
Nov 26 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
杏林同学录(五)
2006/10/09 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP目录操作实例总结
2016/09/27 PHP
PHP后期静态绑定之self::限制实例分析
2018/12/21 PHP
JS控制一个DIV层在指定时间内消失的方法
2014/02/17 Javascript
jQuery 如何先创建、再修改、后添加DOM元素
2014/05/20 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
vue中如何动态绑定图片,vue中通过data返回图片路径的方法
2018/02/07 Javascript
在Angular中使用JWT认证方法示例
2018/09/10 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
15分钟深入了解JS继承分类、原理与用法
2019/01/19 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
js实现数字跳动到指定数字
2020/08/25 Javascript
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
从运行效率与开发效率比较Python和C++
2018/12/14 Python
python实现字符串加密 生成唯一固定长度字符串
2019/03/22 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
pymysql模块的使用(增删改查)详解
2019/09/09 Python
python修改FTP服务器上的文件名
2019/09/11 Python
Python tkinter布局与按钮间距设置方式
2020/03/04 Python
python代码如何注释
2020/06/01 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
美体小铺加拿大官方网站:The Body Shop加拿大
2016/10/30 全球购物
美国隐形眼镜网:Major Lens
2018/02/09 全球购物
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
八年级历史教学反思
2014/01/10 职场文书
结婚典礼证婚词
2014/01/11 职场文书
家长给学校的建议书
2014/05/15 职场文书
华山导游词
2015/02/03 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
陶瓷类经典广告语集锦
2019/10/25 职场文书
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python