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 相关文章推荐
pyqt和pyside开发图形化界面
Jan 22 Python
python连接oracle数据库实例
Oct 17 Python
Python常用库推荐
Dec 04 Python
pandas带有重复索引操作方法
Jun 08 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
Python使用pymysql模块操作mysql增删改查实例分析
Dec 19 Python
tensorflow 获取所有variable或tensor的name示例
Jan 04 Python
Python 解析pymysql模块操作数据库的方法
Feb 18 Python
Windows 平台做 Python 开发的最佳组合(推荐)
Jul 27 Python
解决pytorch-gpu 安装失败的记录
May 24 Python
python关于集合的知识案例详解
May 30 Python
Python自动化之批量处理工作簿和工作表
Jun 03 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/03/24 PHP
php中引用符号(&)的使用详细介绍
2016/12/06 PHP
浅谈laravel-admin form中的数据,在提交后,保存前,获取并进行编辑
2019/10/21 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
用js正确判断用户名cookie是否存在的方法
2014/01/28 Javascript
jQuery构造函数init参数分析
2015/05/13 Javascript
JavaScript中日期的相关操作方法总结
2015/10/24 Javascript
五种js判断是否为整数类型方式
2015/12/03 Javascript
JS事件添加和移出的兼容写法示例
2016/06/20 Javascript
微信小程序-消息提示框实例
2016/11/24 Javascript
360提示[高危]使用存在漏洞的JQuery版本的解决方法
2017/10/27 jQuery
Vue实现active点击切换方法
2018/03/16 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
javascript实现的时间格式加8小时功能示例
2019/06/13 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
实现vuex原理的示例
2020/10/21 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python 3.6 -win64环境安装PIL模块的教程
2019/06/20 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
python中如何使用虚拟环境
2020/10/14 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
python实现b站直播自动发送弹幕功能
2021/02/20 Python
大学毕业生自我鉴定
2013/11/05 职场文书
个人函授自我鉴定
2014/03/25 职场文书
任命书模板
2014/06/04 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
爸爸的三轮车观后感
2015/06/16 职场文书
中国古代史学名著《战国策》概述
2019/08/09 职场文书
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL
vue代码分块和懒加载非必要资源文件
2022/04/11 Vue.js