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实现无证书加密解密实例
Oct 27 Python
Python解决鸡兔同笼问题的方法
Dec 20 Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
python抽取指定url页面的title方法
May 11 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
PyCharm代码回滚,恢复历史版本的解决方法
Oct 22 Python
Django web框架使用url path name详解
Apr 29 Python
python中将两组数据放在一起按照某一固定顺序shuffle的实例
Jul 15 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
Python爬取酷狗MP3音频的步骤
Feb 26 Python
python numpy中multiply与*及matul 的区别说明
May 26 Python
一起来学习Python的元组和列表
Mar 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
造就帕卡马拉的帕卡斯是怎么被发现的
2021/03/03 咖啡文化
PHP实现定时执行任务的方法
2014/10/05 PHP
yii2.0之GridView自定义按钮和链接用法
2014/12/15 PHP
linux下为php添加iconv模块的方法
2016/02/28 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
PHP聚合式迭代器接口IteratorAggregate用法分析
2017/12/28 PHP
javascript中String类的subString()方法和slice()方法
2011/05/24 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
jquery实现的3D旋转木马特效代码分享
2015/08/25 Javascript
JavaScript中三种异步上传文件方式
2016/03/06 Javascript
js实现(全选)多选按钮的方法【附实例】
2016/03/30 Javascript
关于TypeScript中import JSON的正确姿势详解
2017/07/25 Javascript
React-Native做一个文本输入框组件的实现代码
2017/08/10 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
jQuery实现的简单无刷新评论功能示例
2017/11/08 jQuery
JS执行控制之节流模式实例分析
2018/12/21 Javascript
electron 如何将任意资源打包的方法步骤
2020/04/16 Javascript
用Python编写简单的定时器的方法
2015/05/02 Python
在Python文件中指定Python解释器的方法
2019/02/18 Python
pandas如何处理缺失值
2019/07/31 Python
python垃圾回收机制(GC)原理解析
2019/12/30 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
python计算auc的方法
2020/09/09 Python
Python操作word文档插入图片和表格的实例演示
2020/10/25 Python
python集合的新增元素方法整理
2020/12/07 Python
马来西亚银饰品牌:JEOEL
2017/12/15 全球购物
荷兰鞋类购物网站:Donelli
2019/05/24 全球购物
应聘自荐书
2013/10/08 职场文书
出纳员岗位责任制
2014/02/11 职场文书
财务人员担保书
2014/05/13 职场文书
2014年学校办公室工作总结
2014/12/19 职场文书
原告离婚代理词
2015/05/23 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书
只用40行Python代码就能写出pdf转word小工具
2021/05/31 Python
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js