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实现队列的方法
May 26 Python
python实现按行切分文本文件的方法
Apr 18 Python
利用python爬取软考试题之ip自动代理
Mar 28 Python
django使用图片延时加载引起后台404错误
Apr 18 Python
Python递归函数实例讲解
Feb 27 Python
聊聊python里如何用Borg pattern实现的单例模式
Jun 06 Python
Python中变量的输入输出实例代码详解
Jul 28 Python
python实现图像检索的三种(直方图/OpenCV/哈希法)
Aug 08 Python
python调用接口的4种方式代码实例
Nov 19 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
Python实现投影法分割图像示例(二)
Jan 17 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 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仿盗链代码
2012/06/03 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
2015/04/14 PHP
PHP中子类重载父类的方法【parent::方法名】
2016/05/06 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
jQuery中用dom操作替代正则表达式
2014/12/29 Javascript
js随机生成网页背景颜色的方法
2015/02/26 Javascript
JavaScript中计算网页中某个元素的位置
2015/06/10 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
Vue2 模板template的四种写法总结
2018/02/23 Javascript
p5.js 毕达哥拉斯树的实现代码
2018/03/23 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
2019/04/09 Javascript
解析vue、angular深度作用选择器
2019/09/11 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
[01:03]DOTA2新的征程 你的脚印值得踏上
2014/08/13 DOTA
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
python中的json总结
2018/10/11 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
python实现可变变量名方法详解
2019/07/01 Python
python自动化测试无法启动谷歌浏览器问题
2019/10/10 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
前端实现背景虚化但内容清晰且自适应 的实例代码
2019/08/01 HTML / CSS
C语言开发工程师测试题
2016/12/20 面试题
介绍一下代理模式(Proxy)
2014/10/17 面试题
普通院校学生的自荐信
2013/11/27 职场文书
药学职务聘任书
2014/03/29 职场文书
慰问信模板
2015/02/14 职场文书
新闻稿怎么写
2015/07/18 职场文书
2015中学学校工作总结
2015/07/20 职场文书
小学生必读成语故事大全:送给暑假的你们
2019/07/09 职场文书
MySQL COUNT函数的使用与优化
2021/05/10 MySQL