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中的内置函数getattr()介绍及示例
Jul 20 Python
Python入门篇之条件、循环
Oct 17 Python
Python正则表达式教程之一:基础篇
Mar 02 Python
Django配置celery(非djcelery)执行异步任务和定时任务
Jul 16 Python
python numpy数组复制使用实例解析
Jan 10 Python
python编写俄罗斯方块
Mar 13 Python
pandas数据拼接的实现示例
Apr 16 Python
django ORM之values和annotate使用详解
May 19 Python
python如何利用Mitmproxy抓包
Oct 10 Python
Python如何使用神经网络进行简单文本分类
Feb 25 Python
Python数据可视化之绘制柱状图和条形图
May 25 Python
python ansible自动化运维工具执行流程
Jun 24 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数组函数序列之array_unshift() 在数组开头插入一个或多个元素
2011/11/07 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
php实现简单洗牌算法
2013/06/18 PHP
smarty自定义函数htmlcheckboxes用法实例
2015/01/22 PHP
YII2框架中excel表格导出的方法详解
2017/07/21 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
基于JQuery实现的类似购物商城的购物车
2011/12/06 Javascript
js实现浏览器的各种菜单命令比如打印、查看源文件等等
2013/10/24 Javascript
JavaScript通过字典进行字符串翻译转换的方法
2015/03/19 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
关于JS中的方法是否加括号的问题
2016/07/27 Javascript
javascript如何创建对象
2016/08/29 Javascript
jquery+css3问卷答题卡翻页动画效果示例
2016/10/26 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
各种选择框jQuery的选中方法(实例讲解)
2017/06/27 jQuery
node.js+captchapng+jsonwebtoken实现登录验证示例
2017/08/17 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
SpringBoot实现登录注册常见问题解决方案
2020/03/04 Python
jupyter notebook 多行输出实例
2020/04/09 Python
PythonPC客户端自动化实现原理(pywinauto)
2020/05/28 Python
python cv2.resize函数high和width注意事项说明
2020/07/05 Python
保护母亲河倡议书
2014/04/14 职场文书
学校安全责任书
2014/04/14 职场文书
作风大整顿心得体会
2014/09/10 职场文书
2014年体育部工作总结
2014/11/13 职场文书
2015年度个人教学工作总结
2015/05/20 职场文书
领导新年致辞2016
2015/07/29 职场文书
销售人员管理制度
2015/08/06 职场文书
压缩Redis里的字符串大对象操作
2021/06/23 Redis
《废话连篇——致新手》——chinapizza
2022/04/05 无线电
Python 中面向接口编程
2022/05/20 Python