文章内容由--“脚本之家“--提供,在此感谢脚本之家的贡献,该网站网址为:https://www.jb51.net/

简介:

zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率也是比较高的,

在这里对zipfile的使用方法做一些记录。即方便自己也方便别人。

Python zipfile模块用来做zip格式编码的压缩和解压缩的,要进行相关操作,首先需要实例化一个 ZipFile 对象。ZipFile 接受一个字符串格式压缩包名称作为它的必选参数,第二个参数为可选参数,表示打开模式,类似于文件操作,有r/w/a三种模式,分别代表读、写、添加,默认为r,即读模式。

zipfile里有两个非常重要的class, 分别是ZipFile和ZipInfo, 在绝大多数的情况下,我们只需要使用这两个class就可以了。ZipFile是主要的类,用来创建和读取zip文件而ZipInfo是存储的zip文件的每个文件的信息的。

一、下面我们就来介绍这两个类的基本操作:

比如要读取一个Python zipfile 模块,这里假设filename是一个文件的路径:

importzipfile

z=zipfile.ZipFile(filename, 'r')#这里的第二个参数用r表示是读取zip文件,w是创建一个zip文件

for f inz.namelist():print f

上面的代码是读取一个zip压缩包里所有文件的名字。z.namelist() 会返回压缩包内所有文件名的列表。

再看看下面一个:

importzipfile

z= zipfile.ZipFile(filename, 'r')for i inz.infolist():print i.file_size, i.header_offset

这里使用了z.infolist(), 它返回的就是压缩包内所有文件的信息,就是一个ZipInfo的列表。一个ZipInfo对象中包含了压缩包内一个文件的信息,其中比较常用的是 filename, file_size, header_offset, 分别为文件名,文件大小,文件数据在压缩包中的偏移。其实之前的z.namelist()就是读取的ZipInfo中的filename,组成一个 list返回的。

从压缩包里解压缩出一个文件的方法是使用ZipFile的read方法:

importzipfile

z= zipfile.ZipFile(filename, 'r')print z.read(z.namelist()[0])

这样就读取出z.namelist()中的第一个文件,并且输出到屏幕,当然也可以把它存储到文件。下面是创建zip压缩包的方法,与读取的方法其实很类似的:

importzipfile, os

z= zipfile.ZipFile(filename, 'w')#注意这里的第二个参数是w,这里的filename是压缩包的名字

假设要把一个叫testdir中的文件全部添加到压缩包里(这里只添加一级子目录中的文件):

ifos.path.isdir(testdir):for d inos.listdir(testdir):

z.write(testdir+os.sep+d)#close() 是必须调用的!

z.close()

面的代码非常的简单。想想还有一个问题,如果我把一个test/111.txt 添加到压缩包里之后我希望在包里它放到test22/111.txt怎么办呢?其实这个就是Python ZipFile模块的write方法中第二个参数的作用了。只需要这样调用:

z.write("test/111.txt", "test22/111.txt")

二、ZipFile和Zipinfo这两个类的基本操作

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

创建一个ZipFile对象,表示一个zip文件。参数file表示文件的路径或类文件对象(file-like object);参数mode指示打开zip文件的模式,

默认值为'r',表示读已经存在的zip文件,也可以为'w'或'a','w'表示新建一个zip文档或覆盖一个已经存在的zip文档,

importzipfile

f= zipfile.ZipFile(filename, 'r') #这里的第二个参数用r表示是读取zip文件,w或a是创建一个zip文件

for f_name in f.namelist(): #z.namelist() 会返回压缩包内所有文件名的列表。

print(f_name)#上面的代码是读取一个zip压缩包里所有文件的名字。

'a'表示将数据附加到一个现存的zip文档中。参数compression表示在写zip文档时使用的压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。如果要操作的zip文件大小超过2G,应该将allowZip64设置为True。

ZipFile还提供了如下常用的方法和属性:

ZipFile.getinfo(name)

获取zip文档内指定文件的信息。返回一个zipfile.ZipInfo对象,它包括文件的详细信息。

ZipFile.infolist()

获取zip文档内所有文件的信息,返回一个zipfile.ZipInfo的列表。

ZipFile.namelist()

获取zip文档内所有文件的名称列表。

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

将zip文档内的指定文件解压到当前目录。参数member指定要解压的文件名称或对应的ZipInfo对象;参数path指定了解析文件保存的文件夹;

参数pwd为解压密码。下面一个例子将保存在程序根目录下的duoduo.zip内的所有文件解压到D:/Work目录:

importzipfile, os

f= zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip')) #拼接成一个路径

for file inf.namelist():

f.extract(file, r'd:/Work') #在d:/Work中解压文件

f.close()

上面是os.getcwd的用法!!

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

解压zip文档中的所有文件到当前目录。参数members的默认值为zip文档内的所有文件名称列表,也可以自己设置,选择要解压的文件名称。

ZipFile.printdir()

将zip文档内的信息打印到控制台上。

ZipFile.setpassword(pwd)

设置zip文档的密码。

ZipFile.read(name[, pwd])

获取zip文档内指定文件的二进制数据。下面的例子演示了read()的使用,zip文档内包括一个duoduo.txt的文本文件,使用read()方法读取其二进制数据,然后保存到D:/duoduo.txt。

importzipfile, os

zipFile= zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip'))

data= zipFile.read('duoduo.txt')#(lambda f, d: (f.write(d), f.close()))(open(r'd:/duoduo.txt', 'wb'), data) #一行语句就完成了写文件操作。仔细琢磨哦~_~

with open(r'd:/duoduo.txt','wb') as f:for d indata:

f.write(d)

zipFile.close()

ZipFile.write(filename[, arcname[, compress_type]])

将指定文件添加到zip文档中。filename为文件路径,arcname为添加到zip文档之后保存的名称, 参数compress_type表示压缩方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。下面的例子演示了如何创建一个zip文档,并将文件D:/test.doc添加到压缩文档中。

importzipfile, os

zipFile= zipfile.ZipFile(r'D:/test.zip'), 'w')

zipFile.write(r'D:/test.doc', '保存的名字', zipfile.ZIP_DEFLATED)

zipFile.close()

ipFile.writestr(zinfo_or_arcname, bytes)

writestr()支持将二进制数据直接写入到压缩文档。

2、Class ZipInfo

ZipFile.getinfo(name) 方法返回的是一个ZipInfo对象,表示zip文档中相应文件的信息。它支持如下属性:

ZipInfo.filename: 获取文件名称。

ZipInfo.date_time: 获取文件最后修改时间。返回一个包含6个元素的元组:(年, 月, 日, 时, 分, 秒)

ZipInfo.compress_type: 压缩类型。

ZipInfo.comment: 文档说明。

ZipInfo.extr: 扩展项数据。

ZipInfo.create_system: 获取创建该zip文档的系统。

ZipInfo.create_version: 获取 创建zip文档的PKZIP版本。

ZipInfo.extract_version: 获取 解压zip文档所需的PKZIP版本。

ZipInfo.reserved: 预留字段,当前实现总是返回0。

ZipInfo.flag_bits: zip标志位。

ZipInfo.volume: 文件头的卷标。

ZipInfo.internal_attr: 内部属性。

ZipInfo.external_attr: 外部属性。

ZipInfo.header_offset: 文件头偏移位。

ZipInfo.CRC: 未压缩文件的CRC-32。

ZipInfo.compress_size: 获取压缩后的大小。

ZipInfo.file_size: 获取未压缩的文件大小。

下面一个简单的例子说明这些属性的意思:

importzipfile, os

zipFile= zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip'))

zipInfo= zipFile.getinfo('文件中的文件.txt')print ('filename:', zipInfo.filename) #获取文件名称

print ('date_time:', zipInfo.date_time) #获取文件最后修改时间。返回一个包含6个元素的元组:(年, 月, 日, 时, 分, 秒)

print ('compress_type:', zipInfo.compress_type) #压缩类型

print ('comment:', zipInfo.comment) #文档说明

print ('extra:', zipInfo.extra) #扩展项数据

print ('create_system:', zipInfo.create_system) #获取创建该zip文档的系统。

print ('create_version:', zipInfo.create_version) #获取 创建zip文档的PKZIP版本。

print ('extract_version:', zipInfo.extract_version) #获取 解压zip文档所需的PKZIP版本。

print ('extract_version:', zipInfo.reserved) #预留字段,当前实现总是返回0。

print ('flag_bits:', zipInfo.flag_bits) #zip标志位。

print ('volume:', zipInfo.volume) #文件头的卷标。

print ('internal_attr:', zipInfo.internal_attr) #内部属性。

print ('external_attr:', zipInfo.external_attr) #外部属性。

print ('header_offset:', zipInfo.header_offset) #文件头偏移位。

print ('CRC:', zipInfo.CRC) #未压缩文件的CRC-32。

print ('compress_size:', zipInfo.compress_size) #获取压缩后的大小。

print ('file_size:', zipInfo.file_size) #获取未压缩的文件大小。

zipFile.close() #

三、python使用内存zipfile对象在内存中打包文件示例

importzipfileimportStringIOclassInMemoryZip(object):def __init__(self):#Create the in-memory file-like object

self.in_memory_zip =StringIO.StringIO()defappend(self, filename_in_zip, file_contents):'''Appends a file with name filename_in_zip and contents of

file_contents to the in-memory zip.'''

#Get a handle to the in-memory zip in append mode

zf = zipfile.ZipFile(self.in_memory_zip, "a", zipfile.ZIP_DEFLATED, False)#Write the file to the in-memory zip

zf.writestr(filename_in_zip, file_contents)#Mark the files as having been created on Windows so that

#Unix permissions are not inferred as 0000

for zfile inzf.filelist:

zfile.create_system=0returnselfdefread(self):'''Returns a string with the contents of the in-memory zip.'''self.in_memory_zip.seek(0)returnself.in_memory_zip.read()defwritetofile(self, filename):'''Writes the in-memory zip to a file.'''f= file(filename, "w")

f.write(self.read())

f.close()if __name__ == "__main__":#Run a test

imz =InMemoryZip()

imz.append("test.txt", "Another test").append("test2.txt", "Still another")

imz.writetofile("test.zip")

Python读zip文件

下面的代码给出了用Python读取zip文件,打印出压缩文件里面所有的文件,并读取压缩文件中的第一个文件。

importzipfile

z= zipfile.ZipFile("zipfile.zip", "r")#打印zip文件中的文件列表

for filename inz.namelist( ):print 'File:', filename#读取zip文件中的第一个文件

first_file_name =z.namelist()[0]

content=z.read(first_file_name)printfirst_file_nameprint content

Python写/创建zip文件

Python写Zip文件主要用到ZipFile的write函数。

importzipfile

z= zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED)

z.write('test.html')

z.close( )

在创建ZipFile实例的时候,有2点药注意:

1.要用'w'或'a'模式,用可写的方式打开zip文件

2.压缩模式有ZIP_STORED 和 ZIP_DEFLATED,ZIP_STORED只是存储模式,不会对文件进行压缩,这个是默认值,如果你需要对文件进行压缩,必须使用ZIP_DEFLATED模式。

四、python破解zip加密文件的方法

首先我们先来桌面创建一个文件

我们创建了一个名为q的txt文件然后我们将它压缩,压缩的时候记得设置上密码

我这边将密码设置为123456

使用python的zipfile的模块,编写zip文件口令破解机。需要用到 Zip File类中的 extractall方法。这个类和这个方法对我们编程破解有口令保护的Zip文件是很有用的。请注意 extractant(方法用可选参数指定密码的方式。

导入库后,用带有口令保护的Zip文件的文件名,实例化一个新的 Zipfile类。要解压这个Zip文件,我们使用 extractall方法,并在可选参数pwd上填入口令。

创建一个.py文件,在根目录然后在将我们的压缩文件放入同目录里面,项目结构目录:

我们.py文件的代码:

importzipfile

zipFile= zipfile.ZipFile("q.zip","r")//这里是我们的压缩文件

zipFile.extractall(pwd="123456")//这里是我们的密码

这段代码其实就是拿着密码去解压我们刚刚压缩的文件,网上大多数教程都是这样写的,但是我这边使用python3.6就会发现运行的时候报错了:

反正错误大概的意思就是pwd的接收的数据应该是bytes类型但是它得到的却是str类型的反正就是类型错了,那我们就将密码转换为bytes类型,我们的py文件的代码如下:

我们可以看到在我们的项目根目录下多了一个文件就是我们之前压缩的那个文件

接下来我们继续改造,如果用一个错误密码执行这个脚本会发生什么情况?让我们在脚本中增加一些捕获和处理异常的代码,显示错误的信息。

importzipfile

zipFile= zipfile.ZipFile("q.zip","r")try:

password= '123s456'zipFile.extractall(pwd=str.encode(password))exceptException as ex:print(ex)

这时候我们的py文件代码,并且我们还将密码故意写错来测试一下,来看一下运行结果

在这里我们可以看到错误 信息,就是告诉我们密码错误

我们可以用因口令不正确而抛出的异常来测试我们的字典文件(接下来的zidian.text)中是否有Zip文件的口令。实例化一个 Zip File类之后,我们打开字典文件,遍历并测试字典中的每个单词。如果 extractall0函数的执行没有出错,则打印一条消息,输出正确的口令。但是,如果 extractall()函数抛出了一个口令错误的异常,就忽略这个异常,并继续测试字典中的下一个口令。

我们先创建一个zidian.text文件

接下来我们在zidian.text文件中编写我们的密码字典,每一行一个密码,红色部分是我们的正确密码

然后将我们的密码字典放入项目中

接着我们继续修改我们的脚本

zipFile = zipfile.ZipFile("q.zip","r")#打开我们的字典表

passFile = open('zidian.txt')for line inpassFile.readlines():#读取每一行数据(每一个密码)

password = line.strip('\n')try:

zipFile.extractall(pwd=str.encode(password))print('=========密码是:'+password+'\n')#如果密码正确退出程序

exit(0)exceptException as ex:#跳过

pass

接下来我们看一下运行结果

哈哈我们已经成功破解了zip文件的密码,到这里我们不难发现只要我们字典里面有密码我们就可以破解出来

我们继续将我们的项目优化一下:

importzipfiledefextractFile(zFile,password):try:

zFile.extractall(pwd=str.encode(password))#如果成功返回密码

returnpasswordexcept:return

defmain():

zFile= zipfile.ZipFile("q.zip","r")#打开我们的字典表

passFile = open('zidian.txt')for line inpassFile.readlines():#读取每一行数据(每一个密码)

password = line.strip('\n')

guess=extractFile(zFile,password)if(guess):print("=========密码是:"+password+"\n")

exit(0)if __name__=='__main__':

main()

这样就好多了!

接下来再给大家贴一个生成全部六位数数字密码的代码:

f = open('zidian.txt','w')for id in range(1000000):

password= str(id).zfill(6)+'\n'f.write(password)

f.close()

运行成功后我们可以看到再我们的zidian.txt已经生成好了从000000到999999都有了这样我们只要是6位数数字密码的zip文件我们都可以破解了!

python模块实例化_python中zipfile模块实例化解析相关推荐

  1. python的requests模块功能_python中requests模块的使用方法

    本文实例讲述了python中requests模块的使用方法.分享给大家供大家参考.具体分析如下: 在HTTP相关处理中使用python是不必要的麻烦,这包括urllib2模块以巨大的复杂性代价获取综合 ...

  2. python xlrd课程_python中xlrd模块的使用详解

    一.xlrd的安装 打开cmd输入pip install xlrd安装完成即可 二.xlrd模块的使用 下面以这个工作簿为例 1.导入模块 import xlrd 2.打开工作薄 # filename ...

  3. python url模块介绍_python 中 urlparse 模块介绍

    urlparse模块主要是用于解析url中的参数  对url按照一定格式进行 拆分或拼接 1.urlparse.urlparse 将url分为6个部分,返回一个包含6个字符串项目的元组:协议.位置.路 ...

  4. python中importlib模块安装_Python中标准模块importlib详解

    Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外 ...

  5. python模块讲解_python中常用模块详解一

    1.time 模块 import time s = time.localtime() # 把时间转化成格式化的时间,通过. 取得里面的年月日等 struct_time 格式 time.struct_t ...

  6. python中random模块用法_Python中random模块用法实例分析

    本文实例讲述了Python中random模块用法.分享给大家供大家参考.具体如下: import random x = random.randint(1,4); y = random.choice([ ...

  7. python导入模块快捷键_Python中的模块导入和读取键盘输入的方法

    导入模块 import 语句 想使用Python源文件,只需在另一个源文件里执行import语句,语法如下: ? 当解释器遇到import语句,如果模块在当前的搜索路径就会被导入. 搜索路径是一个解释 ...

  8. python time模块计时_python中计时模块timeit的使用方法

    timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导入语句. 从内部讲, ...

  9. python中math模块函数_python中math模块函数

    Python Math 函数必须import math 功能说明指令範例返回x 的反余弦math.acos(x) 返回x 的反双曲余弦math.acosh(x) 返回x 的反正弦math.asin(x ...

最新文章

  1. grep 的特殊使用
  2. 常用Linux Shell命令组合
  3. a href=# 与javascript:void(0)的区别
  4. window.open在Safari中不能打开
  5. MFC的CWnd和HWND之间互相转换方法
  6. 底部分页栏_2020年执业药师考试教材各科目增加页数!最多203页
  7. RedisTemplate和StringRedisTemplate使用
  8. CentOS7 安装或迁移 wordpress(完整迁移)
  9. (软件工程复习核心重点)第二章可行性研究-第一节:可行性研究基本介绍
  10. SQL游标原理和使用方法(转)
  11. bzoj 3209 花神的数论题 —— 数位DP
  12. python运维都做些什么_python运维工程师主要干什么
  13. dubbo调用原理,过程(知其然,知其所以然)
  14. 硒化钼纳米颗粒/MoSe2 Nanoparticles的介绍 提供氨基/NH2/羧基COOH/PEG/蛋白Protein/抗体antibody功能化修饰的硒化钼纳米颗粒/MoSe2 Nanoparti
  15. 移动端可以查看的设计APP,推荐给大家
  16. 人力资源分析思维以及有必要学习数据分析吗?
  17. 学渣的刷题之旅 leetcode刷题 58. 最后一个单词的长度
  18. 健身健美减脂、脱水、充碳记录
  19. ES6 Proxy和Reflect
  20. apk自动升级,高于android N自动安装不弹框的问题解决

热门文章

  1. 安静的飞鸽传书2011绿色版地方
  2. string的飞鸽传书字符串缓冲区
  3. 2个程序员街头卖唱,挽救了自己的秃头
  4. 大公司or小公司,我该怎么选?
  5. 性能优化(6):为什么一定要将css置顶?
  6. OpenCV中的凸包
  7. SQLite | 数据库设计与 Creat Table 语句
  8. 微信重大更新,mac版可刷朋友圈!可以看,可以评论! 支持M1
  9. 种草!这只鹅虽然没有什么用,但是好可爱呀!
  10. tomcat6的项目能直接在tomcat7上用吗_极尽人性化的设计: 能“隐形”的笔记本电脑支架...