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 连接sqlite及简单操作
Jun 30 Python
Python random模块用法解析及简单示例
Dec 18 Python
详解Python判定IP地址合法性的三种方法
Mar 06 Python
python-opencv颜色提取分割方法
Dec 08 Python
python实现扫描局域网指定网段ip的方法
Apr 16 Python
关于sys.stdout和print的区别详解
Dec 05 Python
Django之form组件自动校验数据实现
Jan 14 Python
python随机模块random的22种函数(小结)
May 15 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
Jun 12 Python
python和JavaScript哪个容易上手
Jun 23 Python
Python初学者必备的文件读写指南
Jun 23 Python
Python如何使用循环结构和分支结构
Apr 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
叶罗丽:为什么大家对颜冰这对CP非常关心,却对金茉两人十分冷漠
2020/03/17 国漫
PHP中英混合字符串截取函数代码
2011/07/17 PHP
PHP 小心urldecode引发的SQL注入漏洞
2011/10/27 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
php类声明和php类使用方法示例分享
2014/03/29 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
2008/12/29 Javascript
Javascript Math对象
2009/08/13 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
通过Jquery遍历Json的两种数据结构的实现代码
2011/01/19 Javascript
谈一谈JS消息机制和事件机制的理解
2016/04/14 Javascript
JS未跨域操作iframe里的DOM
2016/06/01 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
jquery引入外部CDN 加载失败则引入本地jq库
2018/05/23 jQuery
jQuery实现动画、消失、显现、渐出、渐入效果示例
2018/09/06 jQuery
jQuery easyui datagird编辑行删除行功能的实现代码
2018/09/20 jQuery
JavaScript实现简易聊天对话框(加滚动条)
2020/02/10 Javascript
小程序跳转到的H5页面再跳转回跳小程序的方法
2020/03/06 Javascript
vue路由权限校验功能的实现代码
2020/06/07 Javascript
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
python中hasattr()、getattr()、setattr()函数的使用
2019/08/16 Python
使用python绘制温度变化雷达图
2019/10/18 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
Python自动化操作实现图例绘制
2020/07/09 Python
编写python代码实现简单抽奖器
2020/10/20 Python
北京振戎融通Java面试题
2015/09/03 面试题
聚美优品陈欧广告词
2014/03/14 职场文书
答谢会策划方案
2014/05/12 职场文书
大学新生军训自我鉴定
2014/09/18 职场文书
2015年教学工作总结
2015/04/02 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python