Python实现压缩和解压缩zip文件

目录

ZipFile类

ZipInfo类

一、读取压缩文件

二、 ZIP 文件解压缩

三、创建和添加zip文件


Python中解压缩和压缩zip文件需要用到ZipFile类和ZipInfo类

ZipFile类

class zipfile.ZipFile(file [,mode [,compression [,allowZip64] ] ])

ZipFile类构造函数,打开一个zip文件,并返回该zip文件的ZipFile对象。

  • file:要打开的zip文件的文件名,可以是一个普通的文件名(一个string),或者是一个类文件(file-like)的对象。
  • mode:文件打开方式。’r’表示读取已存在的文件,’w’表示截取(即存在则清空)并写一个新文件, ‘a’表示追加到一个已存在的文件后面(如果file指向的不是一个zip文件,那么将会创建一个新的zip文件,并且附加到file指向的文件)。
  • compression:当网往zip文件中写时使用的压缩算法,必须是ZIP_STORED或者ZIP_DEFLATED。如果该参数不是这两个可选值,则抛出RuntimeError异常。如果只为ZIP_DEFLATED,但是zlib模块不可用,则仍抛出RuntimeError异常。默认值为ZIP_STORED。如果allowZip64设为True,则当zip文件大于2GB时,会使用ZIP64扩展来创建zip文件。如果值为False(默认),当文件需要ZIP64扩展时,则会抛出异常。ZIP64扩展默认设置为无效,是因为Unix系统上zip和unzip命名不支持该扩展。

ZipFile包含的主要方法有以下几个:

  • ZipFile.close()

关闭zip压缩文件。在程序退出时,必须调用close函数,否则一些必须的记录不会被写到文件中。

  • ZipFile.getinfo(name)

返回压缩文件中名为name的文件的ZipInfo对象。如果name文件不存在,则抛出KeyError异常

  • ZipFile.infolist()

返回一个包含了压缩文件中所有文件各自对应的ZipInfo对象的列表。列表中的排列顺序和在实际压缩文件中的排列顺序相同。

  • ZipFile.namelist()

返回一个包含了压缩文件中所有文件的名字的列表。

  • ZipFile.open(name [,mode [,pwd ] ])

解压压缩文件中一个文件得到类文件(file-like)对象。

  • name:压缩文件中的一个文件名或者是一个ZipInfo对象。
  • mode:必须是’r’、’U’或者’rU’。默认为’r’。选择’U’或者’rU’会使得只读对象中的universal newline功能生效。
  • pwd:解压密码。对一个关闭的ZipFile调用open()会抛出RuntimeError异常。

注意:

1、file-like对象是只读的,且提供了如下函数:read()、readline()、readlines()、__iter__()、next()

2、open()、read()和extract()函数,都接受一个文件名或者一个ZipInfo对象。当zip文件中存在重名的文件时,你会喜欢用这个方法的。

  • ZipFile.extract(member [,path [,pwd]])

解压zip文件中的文件member到当前工作目录。文件的信息会尽可能准确的被解压出来。path指示解压到另一个目录。pwd是解压密码。

  • ZipFile.extractall([path [,members [,pwd]]])

解压所有文件到当前工作目录。path指示解压到另一个目录。pwd是解压密码。

  • ZipFile.printdir()

以表格形式显示压缩文件中所有文件。

  • ZipFile.setpassword(pwd)

设置pwd为默认解压密码,用来解压加密的文件。

  • ZipFile.read(name [,pwd])

返回压缩文件中name文件的字节(bytes)。压缩文件必须是以read或者append模式打开。

  • name:文件名或ZipInfo对象
  • pwd:解压密码。如果指定了该参数,会覆盖sefpassword()中指定的默认解码密码。

对已经关闭的zip文件调用read()会产生一个RuntimeError的异常。

ZipInfo类

ZipInfo类的实例由ZipFile对象的getinfo()和infolist()函数返回。每一个对象值保存压缩包中一个文件的信息。ZipInfo对象有如下属性:

  • ZipInfo.filename

压缩包中的该文件名

  • ZipInfo.date_time

压缩包中该文件的最新修改时间,是一个包含6个元素的元组tuple。

  • ZipInfo.compress_type

文件的压缩类型

  • ZipInfo.comment

文件的注释

 

  • 一、读取压缩文件

我们要读取zip文件的内容,首先需要创建一个ZipFile对象,要创建一个 ZipFile对象,就需要调用 zipfile.ZipFile()函数, 向它传入一个字符串, 表示.zip 文件的文件名。需要注意的是zipfile和ZipFile的区别,zipfile是Python中的一个模块,而ZipFile()是这个模块中的一个函数。

读取压缩文件代码示例:

#coding:utf-8
import zipfile,os
def readzip_file(zip_dir):
    zip_name = zip_dir+'\\my_file.zip'
    MyZipfile = zipfile.ZipFile(zip_name)
    fileList = MyZipfile.namelist()  #获取压缩文件中的所有文件名称列表
    print(fileList)
    print(MyZipfile.getinfo(fileList[1]).file_size)  #获取文件列表中第2个文件的大小
    MyZipfile.close()

if __name__=="__main__":
    print('---开始读取压缩文件---')
    zip_dir = os.getcwd()  #获取压缩文件所在目录
    print('文件路径:'+zip_dir)
    read_file = readzip_file(zip_dir)
    print('---读取压缩文件完成---')

上例中我们用到了ZipFile 对象的namelist()方法和getinfo()方法,namelist()返回 ZIP 文件中包含的所有文件和文件夹的字符串的列表。getinfo()方法,返回一个关于特定文件的 ZipInfo 对象,ZipInfo 对象有自己的属性,如file_size和 compress_size,它们分别表示原来文件大小和压缩后文件大小

  • 二、 ZIP 文件解压缩

ZipFile 对象的 extractall()方法从 ZIP 文件中解压缩所有文件和文件夹, 放到当前工作目录中。

ZipFile 对象的 extract()方法从 ZIP 文件中解压缩单个文件。

def unzip_file(zip_dir):
    zip_dir = os.getcwd()
    MyZipfile = zipfile.ZipFile('my_file.zip')
    Myextract_file = MyZipfile.extractall('myfile')  # 解压缩文件
  • 三、创建和添加zip文件

       要创建压缩 ZIP 文件, 必须以“写模式”打开 ZipFile 对象,即传入'w'作为第二个参数( 这类似于向 open()函数传入'w',以写模式打开一个文本文件)。向 ZipFile 对象的 write()方法传入一个路径, Python 就会压缩该路径所指的文件, 将它加到 ZIP 文件中。 write()方法的第一个参数是一个字符串, 代表要添加的文件名。第二个参数是“压缩类型”参数,它告诉计算机使用怎样的算法来压缩文件。可以总是将这个值设置为 zipfile.ZIP_DEFLATED( 这指定了 deflate 压缩算法,它对各种类型的数据都很有效)。

def compressed_files(zip_dir):
    zip_dir = os.getcwd()  #获取文件路径
    newZip = zipfile.ZipFile('my_new_file.zip','w')
    newZip.write('myfile//my_file//mytext.txt',compress_type=zipfile.ZIP_DEFLATED)  #压缩文件
    newZip.close()

       像写入文件一样,写模式将擦除 ZIP 文件中所有原有的内容。如果只是希望将文件添加到原有的 ZIP 文件中, 就要向zipfile.ZipFile()传入'a'作为第二个参数,以添加模式打开 ZIP 文件。


 


 


 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值