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操作json数据的一个简单例子
Apr 17 Python
使用Python脚本在Linux下实现部分Bash Shell的教程
Apr 17 Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 Python
解决Python出现_warn_unsafe_extraction问题的方法
Mar 24 Python
Python设计模式之原型模式实例详解
Jan 18 Python
python保存字典和读取字典的实例代码
Jul 07 Python
解决Django layui {{}}冲突的问题
Aug 29 Python
Django使用list对单个或者多个字段求values值实例
Mar 31 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
Python 创建TCP服务器的方法
Jul 28 Python
Python爬虫之Spider类用法简单介绍
Aug 04 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中文字母数字验证码实现代码
2008/04/25 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
Yii中表单用法实例详解
2016/01/05 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
Swoole4.4协程抢占式调度器详解
2019/05/23 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
让IE6支持min-width和max-width的方法
2010/06/25 Javascript
JavaScript格式化数字的函数代码
2010/11/30 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
js点击列表文字对应该行显示背景颜色的实现代码
2015/08/05 Javascript
jquery动态创建div与input的实例代码
2016/10/12 Javascript
浅谈jquery的html方法里包含特殊字符的处理
2016/11/30 Javascript
js常用DOM方法详解
2017/02/04 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
详解Angular4中路由Router类的跳转navigate
2017/06/09 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
python实现类的静态变量用法实例
2015/05/08 Python
python3实现ftp服务功能(客户端)
2017/03/24 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
使用python接入微信聊天机器人
2020/03/31 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
Python多线程threading创建及使用方法解析
2020/06/17 Python
Made in Design德国:设计师家具、灯具和装饰
2019/10/31 全球购物
荣耀俄罗斯官网:HONOR俄罗斯
2020/10/31 全球购物
教师档案管理制度
2014/01/23 职场文书
电力公司个人求职信范文
2014/02/04 职场文书
大学班级干部的自我评价分享
2014/02/10 职场文书
环卫工作汇报材料
2014/10/28 职场文书
离婚协议书的范本
2015/01/27 职场文书
解决vue中provide inject的响应式监听
2022/04/19 Vue.js