返回顶部
首页 > 资讯 > 后端开发 > Python >python中zipfile模块实例化解
  • 847
分享到

python中zipfile模块实例化解

实例模块python 2023-01-31 00:01:46 847人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

文章内容由--“编程网“--提供,在此感谢编程网的贡献,该网站网址为:https://www.jb51.net/   zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率

文章内容由--“编程网“--提供,在此感谢编程网的贡献,该网站网址为: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是一个文件的路径:

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

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

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

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

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

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

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

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

if os.path.isdir(testdir):  
     for d in os.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文档,

import zipfile
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目录:

import zipfile, os
f = zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip')) #拼接成一个路径
for file in f.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。

 

import zipfile, 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 in data:
  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添加到压缩文档中。

import zipfile, 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: 获取未压缩的文件大小。

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

import zipfile, 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对象在内存中打包文件示例

import zipfile
import StringIO
class InMemoryZip(object):
    def __init__(self):
        # Create the in-memory file-like object
        self.in_memory_zip = StringIO.StringIO()

    def append(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 in zf.filelist:
            zfile.create_system = 0       

        return self

    def read(self):
        '''Returns a string with the contents of the in-memory zip.'''
        self.in_memory_zip.seek(0)
        return self.in_memory_zip.read()

    def writetofile(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文件,打印出压缩文件里面所有的文件,并读取压缩文件中的第一个文件。

import zipfile
z = zipfile.ZipFile("zipfile.zip", "r")
#打印zip文件中的文件列表
for filename in z.namelist( ):
  print 'File:', filename
#读取zip文件中的第一个文件
first_file_name = z.namelist()[0]
content = z.read(first_file_name)
print first_file_name
print content

 

Python写/创建zip文件

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

import zipfile
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文件的代码:

import zipfile 
zipFile = zipfile.ZipFile("q.zip","r")//这里是我们的压缩文件 
zipFile.extractall(pwd="123456")//这里是我们的密码

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

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

import zipfile
zipFile = zipfile.ZipFile("q.zip","r")
passWord = '123456'
zipFile.extractall(pwd=str.encode(password) )

这时候我们再次运行项目

这次没有报错

 

 

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


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

import zipfile 
zipFile = zipfile.ZipFile("q.zip","r") 
try: 
 password = '123s456'
 zipFile.extractall(pwd=str.encode(password)) 
except Exception 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 in passFile.readlines(): 
 #读取每一行数据(每一个密码) 
 password = line.strip('\n') 
 try: 
 zipFile.extractall(pwd=str.encode(password)) 
 print('=========密码是:'+password+'\n') 
 #如果密码正确退出程序 
 exit(0) 
 except Exception as ex: 
 #跳过 
 pass

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

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

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

import zipfile 
def extractFile(zFile,password): 
 try: 
 zFile.extractall(pwd=str.encode(password)) 
 #如果成功返回密码 
 return password 
 except: 
 return
def main(): 
 zFile = zipfile.ZipFile("q.zip","r") 
 #打开我们的字典表 
 passFile = open('zidian.txt') 
 for line in passFile.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文件我们都可以破解了!

 

--结束END--

本文标题: python中zipfile模块实例化解

本文链接: https://lsjlt.com/news/182636.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python中zipfile模块实例化解
    文章内容由--“编程网“--提供,在此感谢编程网的贡献,该网站网址为:https://www.jb51.net/   zipfile是python里用来做zip格式编码的压缩和解压缩的,由于是很常见的zip格式,所以这个模块使用频率...
    99+
    2023-01-31
    实例 模块 python
  • python模块--zipfile文件压
    zipfile模块是python中一个处理压缩文件的模块,解决了不少我们平常需要处理压缩文件的需求 ,本文主要谈谈zipfile几个常用的用法。   首先我在Windows操作系统中创建如下的文件目录:   一、读取压缩文件: 代码: ...
    99+
    2023-01-30
    模块 文件 python
  • python zipfile模块学习笔记
    ZIP文件格式是一种常见的存档和压缩标准,这个zipfile模块提供了工具来创建、读取、写入、附加和列出一个ZIP文件。使用ZIP64扩展(即压缩文件大小超过4G),它能解压加密的ZIP文件,解密过程很慢。1、测试是否为ZIP文件is_zi...
    99+
    2023-01-31
    学习笔记 模块 python
  • Python中zipfile压缩包模块的使用
    简介 ZIP 文件格式是一个常用的归档与压缩标准,zipfile 模块提供了创建、读取、写入、添加及列出 ZIP 文件的工具 此模块目前不能处理分卷 ZIP 文件,支持解密 ZIP 归档中的加密文件,但是目前不能创建...
    99+
    2022-06-02
    Python zipfile
  • Python 中ZipFile模块的功能是什么
    Python 中ZipFile模块的功能是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python ZipFile模块用来做zip格式编码的压缩和解压缩的...
    99+
    2023-06-17
  • Python模块中Zipfile的作用是什么
    今天就跟大家聊聊有关Python模块中Zipfile的作用是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。在这里对zipfile的使用方法做一些记录。即方便自己也方便别人。zip...
    99+
    2023-06-17
  • 如何在Python中使用zipfile压缩包模块
    这期内容当中小编将会给大家带来有关如何在Python中使用zipfile压缩包模块,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。简介ZIP 文件格式是一个常用的归档与压缩标准,zipfile 模块提供了创...
    99+
    2023-06-15
  • 关于Python中zipfile压缩包模块的使用
    目录简介解压文件是否ZIP文件读取元数据从其他数据源压缩文件写入ZipInfo追加文件创建包含Python库的ZIP简介 ZIP 文件格式是一个常用的归档与压缩标准,zipfile&...
    99+
    2023-05-15
    Python zipfile Python 压缩包模块 zipfile压缩包模块
  • Python中的zipfile压缩包模块如何使用
    这篇文章主要介绍“Python中的zipfile压缩包模块如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python中的zipfile压缩包模块如何使用”文章能帮助大家解决问题。简介ZIP ...
    99+
    2023-07-06
  • python zipfile模块的文件怎么操作
    本文小编为大家详细介绍“python zipfile模块的文件怎么操作”,内容详细,步骤清晰,细节处理妥当,希望这篇“python zipfile模块的文件怎么操作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1...
    99+
    2023-06-30
  • 如何在python中使用zipfile模块操作文件
    这篇文章将为大家详细讲解有关如何在python中使用zipfile模块操作文件,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesut...
    99+
    2023-06-14
  • Node模块化开发实例解析
    目录一、介绍1. 什么是模块化开发2. Node.js中的模块化3. 模块化开发的优点二、CommonJS规范1. CommonJS规范介绍2. Node.js中的模块加载机制3. ...
    99+
    2023-03-13
    Node模块化开发 Node 模块化
  • Python标准库之zipfile和tarfile模块的使用
    目录zip格式ZipFile参数说明操作含义压缩方法常用方法tar包 和 gz、bz2、xz格式操作tar包压缩解压缩删除压缩包中的文件在我们常用的系统windows和Linux系统...
    99+
    2024-04-02
  • Python中String模块示例详解
    目录Python中String模块详解一、 字符串常量二、 类1、 格式化1.1 介绍1.2 简单应用1.3 格式化输出2、 模板化三、 函数Python中String模块详解 一、...
    99+
    2022-12-24
    Python中String模块 Python String模块
  • Python中ConfigParser模块示例详解
    目录1. 简介2. ini配置文件格式3. 读取ini文件3.1 初始化对象并读取文件3.2 获取并打印所有节点名称3.3 获取指定节点的所有key3.4 获取指定节点的键值对3.5...
    99+
    2023-01-15
    Python中ConfigParser模块 Python中ConfigParser
  • 详解Python模块化--模块(Modules)和包(Packages)
    目录引言Python Modules模块导入模块①导入整个模块②导入模块中的特定函数③导入模块中的所有函数给导入的模块一个别名单独运行模块加速模块加载Python Packages包引用包(Package)中的模块引...
    99+
    2022-06-02
    Python Modules模块 Packages包
  • Python matplotlib的spines模块实例详解
    目录spines 模块详解Spine 类Spine 类的定义Spine 类参数创建 Spine 对象的实例创建直线型 Spine 并添加到 axesspine_type=&lsquo...
    99+
    2024-04-02
  • Python中os模块的实例用法
    1、说明 os.path.exists():用于判断某个路径(文件或文件夹)是否存在,若存在则返回True,若不存在则返回False。 os.makedirs():用于创建文件夹。传入所欲创建的文件夹的路径即可,没有...
    99+
    2022-06-02
    Python os模块
  • Verilog语言关键字模块例化实例讲解
    目录关键字:例化,generate,全加器,层次访问命名端口连接顺序端口连接端口连接规则用 generate 进行模块例化层次访问关键字:例化,generate,全加器,层次访问 ...
    99+
    2023-05-15
    Verilog语言关键字模块例化 Verilog 模块例化
  • Python压缩包处理模块zipfile和py7zr怎么使用
    这篇“Python压缩包处理模块zipfile和py7zr怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作