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的Flask框架中配置多个子域名的方法讲解
Jun 07 Python
python3.5 + PyQt5 +Eric6 实现的一个计算器代码
Mar 11 Python
Python构建网页爬虫原理分析
Dec 19 Python
python 除法保留两位小数点的方法
Jul 16 Python
对pandas中时间窗函数rolling的使用详解
Nov 28 Python
python实现蒙特卡罗方法教程
Jan 28 Python
Pandas统计重复的列里面的值方法
Jan 30 Python
Django web框架使用url path name详解
Apr 29 Python
Python实现12306火车票抢票系统
Jul 04 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
如何使用Python实现一个简易的ORM模型
May 12 Python
基于Python实现股票收益率分析
Apr 02 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 数组排序方法总结 推荐收藏
2010/06/30 PHP
php操作SVN版本服务器类代码
2011/11/27 PHP
深入PHP autoload机制的详解
2013/06/09 PHP
thinkphp区间查询、统计查询与SQL直接查询实例分析
2014/11/24 PHP
php中使用gd库实现下载网页中所有图片
2015/05/12 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
初识JQuery 实例一(first)
2011/03/16 Javascript
常见效果实现之返回顶部(结合淡入、淡出、减速滚动)
2012/01/04 Javascript
JS根据变量保存方法名并执行方法示例
2014/04/04 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
jQuery获取剪贴板内容的方法
2016/06/16 Javascript
Bootstrap导航条的使用和理解3
2016/12/14 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
微信小程序地图导航功能实现完整源代码附效果图(推荐)
2019/04/28 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
vue实现lodop打印功能的示例
2020/11/11 Javascript
python中的装饰器详解
2015/04/13 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
Python中的pack和unpack的使用
2018/03/12 Python
Python实现求解一元二次方程的方法示例
2018/06/20 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
python使用minimax算法实现五子棋
2019/07/29 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
移动端适配 使px自动转换rem
2019/08/26 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
学习型班组申报材料
2014/05/31 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书
开平碉楼导游词
2015/02/06 职场文书
工作自我评价范文
2015/03/05 职场文书
一个家长教育孩子的心得体会
2016/01/15 职场文书