zipfile — 访问 ZIP 压缩文件
zipfile — 访问 ZIP 压缩文件
1.概述
zipfile 模块可用于操作 ZIP 存档文件,.zip 是 PC 程序 PKZIP 推广的格式
2.测试数据
为了演示用,你需要创建以下三个文件
1.README.txt 内容如下,注意最后一行为空行
The examples for the zipfile module use
this file and example.zip as data.
2.使用压缩软件将 README.txt 压缩为 example.zip,压缩式选储存选项,不需要压缩
3.新建一个空的文本文档,并改名为 bad_example.zip
3.测试 ZIP 文件
is_zipfile() 函数返回一个布尔值,指示作为参数传递的文件名是否指向有效的 ZIP 存档
import zipfilefor filename in ['README.txt', 'example.zip','bad_example.zip', 'notthere.zip']:print('{:>15} {}'.format(filename, zipfile.is_zipfile(filename)))
如果文件根本不存在,is_zipfile() 返回 False
README.txt Falseexample.zip True
bad_example.zip Falsenotthere.zip False
4.从 Zip 存档中读取元数据
使用 ZipFile 类直接处理 Zip 存档文件。它支持从现有存档中读取数据,也支持向现有存档中加入文件、修改存档。
4.1.查看zip包所有文件列表
import zipfilewith zipfile.ZipFile('example.zip', 'r') as zf:print(zf.namelist())
namelist() 方法以列表的形式返回已有存档中所有的文件名
['README.txt']
存档中的文件名列表只是存档中可用信息的一小部分。可以使用 infolist() 或 getinfo() 方法访问 Zip 文件的全部元数据。
4.2.查看zip包元数据
import datetime
import zipfiledef print_info(archive_name):with zipfile.ZipFile(archive_name) as zf:for info in zf.infolist():print(info.filename)print(' Comment :', info.comment)mod_date = datetime.datetime(*info.date_time)print(' Modified :', mod_date)if info.create_system == 0:system = 'Windows'elif info.create_system == 3:system = 'Unix'else:system = 'UNKNOWN'print(' System :', system)print(' ZIP version :', info.create_version)print(' Compressed :', info.compress_size, 'bytes')print(' Uncompressed:', info.file_size, 'bytes')print()if __name__ == '__main__':print_info('example.zip')
除了以上输出信息之外,Zip 存档还包含额外的数据。不过你需要仔细阅读 PKZIP 应用注释 中的 Zip 格式相关的部分,然后才能把这些附加数据解密为有用的信息。
README.txtComment : b''Modified : 2010-11-15 06:48:02System : UnixZIP version : 30Compressed : 65 bytesUncompressed: 76 bytes
如果你已经预先知道了 Zip 存档中某个文件的名字。你可以通过 getinfo() 方法直接得到它的 ZipInfo 对象。
import zipfilewith zipfile.ZipFile('example.zip') as zf:for filename in ['README.txt', 'notthere.txt']:try:info = zf.getinfo(filename)except KeyError:print('ERROR: Did not find {} in zip file'.format(filename))else:print('{} is {} bytes'.format(info.filename, info.file_size))
如果存档中的某个文件不存在,调用 getinfo() 方法会产生一个 KeyError
README.txt is 76 bytes
ERROR: Did not find notthere.txt in zip file
5.从 Zip 存档中读取文件内容
要访问存档中的数据,可以将文件名传递给 read() 方法,返回结果为对应文件的内容。
import zipfilewith zipfile.ZipFile('example.zip') as zf:for filename in ['README.txt', 'notthere.txt']:try:data = zf.read(filename)except KeyError:print('ERROR: Did not find {} in zip file'.format(filename))else:print(filename, ':')print(data)print()
如果有必要,数据会被自动解压
README.txt :
b'The examples for the zipfile module use \nthis file and exampl
e.zip as data.\n'ERROR: Did not find notthere.txt in zip file
6.创建zip压缩包
6.1.只归档文件默认不压缩文件
要创建新的 Zip 存档,需要以 ‘w’ 模式实例化一个 ZipFile 对象,存档中任何现有的文件都会被清空,相当于新建一个存档开始写入。如果你想要向现有存档中添加文件,你可以使用 write() 方法。
from zipfile_infolist import print_info
import zipfileprint('creating archive')
with zipfile.ZipFile('write.zip', mode='w') as zf:print('adding README.txt')zf.write('README.txt')print()
print_info('write.zip')
默认情况下,存档的文件不会被压缩。
creating archive
adding README.txtREADME.txtComment : b''Modified : 2016-08-07 13:31:24System : UnixZIP version : 20Compressed : 76 bytesUncompressed: 76 bytes
6.2.归档并压缩文件
要实现压缩功能,需要使用 zlib 模块。如果 zlib 模块可用,你可以使用 zipfile.ZIP_DEFLATED 选项,让 zipfile 进入对单独的文件或整个存档进行压缩的模式。默认的压缩设置是 zipfile.ZIP_STORED,这种模式下 zipfile 只会将文件添加进存档而不压缩它。
from zipfile_infolist import print_info
import zipfile
try:import zlibcompression = zipfile.ZIP_DEFLATED
except (ImportError, AttributeError):compression = zipfile.ZIP_STOREDmodes = {zipfile.ZIP_DEFLATED: 'deflated',zipfile.ZIP_STORED: 'stored',
}print('creating archive')
with zipfile.ZipFile('write_compression.zip', mode='w') as zf:mode_name = modes[compression]print('adding README.txt with compression mode', mode_name)zf.write('README.txt', compress_type=compression)print()
print_info('write_compression.zip')
此时,存档内容已被压缩了
creating archive
adding README.txt with compression mode deflatedREADME.txtComment : b''Modified : 2016-08-07 13:31:24System : UnixZIP version : 20Compressed : 65 bytesUncompressed: 76 bytes
6.3.重命名文件
给 write() 方法传递一个 arcname 值,你就可以将文件以新的文件名加入存档。等价于将文件改名后再加入存档
from zipfile_infolist import print_info
import zipfilewith zipfile.ZipFile('write_arcname.zip', mode='w') as zf:zf.write('README.txt', arcname='NOT_README.txt')print_info('write_arcname.zip')
如你所见,存档中的文本文件没有使用原来的文件名
NOT_README.txtComment : b''Modified : 2016-08-07 13:31:24System : UnixZIP version : 20Compressed : 76 bytesUncompressed: 76 bytes
6.4.内存数据写入压缩包
有时候你需要将某个字符串写入 Zip 存档,而不是将现有的文件加入存档。你不需要先把字符串写入文件,然后再将文件写入存档,通过 writestr() 方法,你可以直接将字节流的字符串写入 Zip 存档。
from zipfile_infolist import print_info
import zipfilemsg = 'This data did not exist in a file.'
with zipfile.ZipFile('writestr.zip',mode='w',compression=zipfile.ZIP_DEFLATED,) as zf:zf.writestr('from_string.txt', msg)print_info('writestr.zip')with zipfile.ZipFile('writestr.zip', 'r') as zf:print(zf.read('from_string.txt'))
以上示例中,传递给 ZipFile 的 compress_type 参数指定了需要压缩数据,因为 writestr() 方法不支持指定是否压缩的参数。
from_string.txtComment : b''Modified : 2016-12-29 12:14:42System : UnixZIP version : 20Compressed : 36 bytesUncompressed: 34 bytesb'This data did not exist in a file.'
6.5.修改zip元数据
通常情况下,当你向存档加入新文件或写入字符串时,存档的修改日期会自动被计算并更新。你可以将 一个 ZipInfo 实例传递给 writestr() 方法,这样你就可以自定义存档的修改日期以及其它的元数据了。
import time
import zipfile
from zipfile_infolist import print_infomsg = b'This data did not exist in a file.'with zipfile.ZipFile('writestr_zipinfo.zip',mode='w',) as zf:info = zipfile.ZipInfo('from_string.txt',date_time=time.localtime(time.time()),)info.compress_type = zipfile.ZIP_DEFLATEDinfo.comment = b'Remarks go here'info.create_system = 0zf.writestr(info, msg)print_info('writestr_zipinfo.zip')
在这个例子里,修改时间定为当前时间、数据被压缩了、使用了一个假的 create_system 值「原作者使用 Unix 系统,对应的 create_system 值为 3,而这里设置为 0 对应 Windows 系统」并加上了一条简单的注释。
from_string.txtComment : b'Remarks go here'Modified : 2016-12-29 12:14:42System : WindowsZIP version : 20Compressed : 36 bytesUncompressed: 34 bytes
6.6.追加文件
除了创建新文件外,我们也可以向已有的存档中追加新文件,或者向现存的文件尾部追加新的存档,现有的文件可以是 .exe 文件或者自解压存档。要打开文件并在尾部追加内容,请使用 ‘a’ 模式。
from zipfile_infolist import print_info
import zipfileprint('creating archive')
with zipfile.ZipFile('append.zip', mode='w') as zf:zf.write('README.txt')print()
print_info('append.zip')print('appending to the archive')
with zipfile.ZipFile('append.zip', mode='a') as zf:zf.write('README.txt', arcname='README2.txt')print()
print_info('append.zip')
输出的档案包含两个文件
creating archiveREADME.txtComment : b''Modified : 2016-08-07 13:31:24System : UnixZIP version : 20Compressed : 76 bytesUncompressed: 76 bytesappending to the archiveREADME.txtComment : b''Modified : 2016-08-07 13:31:24System : UnixZIP version : 20Compressed : 76 bytesUncompressed: 76 bytesREADME2.txtComment : b''Modified : 2016-08-07 13:31:24System : UnixZIP version : 20Compressed : 76 bytesUncompressed: 76 bytes
7.python文件存档
Python 可以通过 zipimport 从 sys.path 路径中的 Zip 存档内导入模块。我们可以将已经编写好的
PyZipFile 类构造成一个可以这样使用的模块。额外的 writepy() 方法告诉 PyZipFile 扫描当前目录下的每一个 .py 文件,并将对应的 .pyo 或 .pyc 文件添加进 Zip 存档。如果两种格式的文件都不存在,新的 .pyc 文件会被编译并加入存档中。
import sys
import zipfileif __name__ == '__main__':with zipfile.PyZipFile('pyzipfile.zip', mode='w') as zf:zf.debug = 3print('Adding python files')zf.writepy('.')for name in zf.namelist():print(name)print()sys.path.insert(0, 'pyzipfile.zip')import zipfile_pyzipfileprint('Imported from:', zipfile_pyzipfile.__file__)
当 PyZipFile 的调试属性被设为 3 时,编译每一个 .py 文件时都会出详细的调试信息。
Adding python files
Adding files from directory .
Compiling ./zipfile_append.py
Adding zipfile_append.pyc
Compiling ./zipfile_getinfo.py
Adding zipfile_getinfo.pyc
Compiling ./zipfile_infolist.py
Adding zipfile_infolist.pyc
Compiling ./zipfile_is_zipfile.py
Adding zipfile_is_zipfile.pyc
Compiling ./zipfile_namelist.py
Adding zipfile_namelist.pyc
Compiling ./zipfile_printdir.py
Adding zipfile_printdir.pyc
Compiling ./zipfile_pyzipfile.py
Adding zipfile_pyzipfile.pyc
Compiling ./zipfile_read.py
Adding zipfile_read.pyc
Compiling ./zipfile_write.py
Adding zipfile_write.pyc
Compiling ./zipfile_write_arcname.py
Adding zipfile_write_arcname.pyc
Compiling ./zipfile_write_compression.py
Adding zipfile_write_compression.pyc
Compiling ./zipfile_writestr.py
Adding zipfile_writestr.pyc
Compiling ./zipfile_writestr_zipinfo.py
Adding zipfile_writestr_zipinfo.pyc
zipfile_append.pyc
zipfile_getinfo.pyc
zipfile_infolist.pyc
zipfile_is_zipfile.pyc
zipfile_namelist.pyc
zipfile_printdir.pyc
zipfile_pyzipfile.pyc
zipfile_read.pyc
zipfile_write.pyc
zipfile_write_arcname.pyc
zipfile_write_compression.pyc
zipfile_writestr.pyc
zipfile_writestr_zipinfo.pycImported from: pyzipfile.zip/zipfile_pyzipfile.pyc
相关文章:
zipfile — 访问 ZIP 压缩文件
zipfile — 访问 ZIP 压缩文件 1.概述 zipfile 模块可用于操作 ZIP 存档文件,.zip 是 PC 程序 PKZIP 推广的格式 2.测试数据 为了演示用,你需要创建以下三个文件 1.README.txt 内容如下,注意最后一行为空行 The examples for the zipfil…...
检查nmos管是否损坏
NCEP85T14 功率mos管为例 以NMOS举例,只用万用表二极管档测量MOS管的好坏-电子发烧友网 NMOS的D极和S极之间有一个寄生二极管,方向为S到D,利用二极管单向导电性以及MOS管导通时寄生二极管截止的特性,可以快速测量MOS好坏。 1、测…...
第七章 - 聚合函数(count,avg,sum,max,min)和一些数学函数
第七章 - 聚合函数使用别名 ascount() 计数avg() 平均值sum() 求和max() 最大值min() 最小值一些数学计算函数Abs()Cos()Exp()Mod()Pi()radians()Sin()Sqrt()Power()Ceil()Floor()使用别名 as 在SQL中可以使用 as 来为一个字段或者一个值设置新的别名下面聚合函数的使用中就会…...
Typescript的原始据类型和Any类型
最新的ECMAScript标准定义了8中数据类型: 7种原始类型: BooleanNullUndefinedNumberBigintStringSymbol和 Object 除 Object 以外的所有类型都是不可变的 (值本身无法被改变》。例如,与C语言不同JavaScript 中字符串是不可变的 (译注: 如,Ja…...
[python入门㊼] - python类的高级函数
目录 ❤ 类的高级函数 ❤ __str__ ❤ __getattr__ ❤ __setattr__ ❤ __call__ ❤ 类的高级函数 今天来为大家介绍几个类中的高级函数,它们也是类中的内置函数。通过使用它们, 会让我们在进行类开发的时候更加的顺手,接下来我们就…...
【Windows】使用Fiddler 工具对手机进行接口监听
目录 工具下载 配置Fidder 手机端获取证书 过滤指定接口 工具下载 CSDN下载地址 其他下载地址 配置Fidder 安装后,打开进入如下界面 在fiddler菜单项选择Tools -> Options -> HTTPS 勾选【Decrypt HTTPS traffic 】 下拉框默认:【from al…...
SpringCloudAlibab-nacos
一、介绍注册中心配置中心的整合SpringCloudAlibaba中文地址:https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/README-zh.md下载地址:https://github.com/alibaba/nacos/访问:http://localhost:8848/nacos/二、使用1、添加依赖&…...
从一致性角度考虑推荐冷启动长尾推荐问题(二)
前言:在推荐系统中user&item emb往往是最重要的特征之一,在冷启动和长尾优化的工作中,往往也是优化的重点,相当一部分工作是围绕着emb优化展开,所以这里单独开了一章。4)emb分布一致性主要思路在于冷启内容emb和高…...
电脑c盘满了怎么清理,c盘空间清理
电脑c盘满了怎么清理?电脑C盘满了可能是因为您的操作系统、程序文件、下载文件、临时文件、垃圾文件等占用了太多的存储空间。所以,我们就需要进行一些操作和清理。 一.清理电脑C盘的方法 清理临时文件和垃圾文件。在Windows上,您可以使用系…...
vite的基本使用
vite 浏览器原生支持模块化 浏览器原生加载的缺点 1.必须明确的写上后缀名 2.如果某一个模块 加载跟多其他的js文件 那么这些js文件都需要被依次加载 浏览器需要将所有的js文件请求下来 发送跟多的http请求(效率也是非常低的) 3.如果代码中由typescrip…...
JavaScript 字符串(String) 对象
JavaScript 是一种流行的编程语言,可以用于开发各种 Web 应用程序和移动应用程序。在 JavaScript 中,字符串是一种非常常见的数据类型,可以使用 JavaScript 字符串(String)对象来处理。本文将详细介绍 JavaScript 字符…...
小知识点:Mac M1/M2 VMware Fusion 安装 Centos 7.9(ARM 64 版本)
最近换了 Mac M2 芯片的笔记本,用原来的 Centos 镜像安装虚拟机直接报错 “无法打开此虚拟机的电源,因为它需要使用 X86 计算机架构,而该架构与此 Arm 计算机架构主机不兼容。” 安装流程前置一、下载镜像二、安装虚拟机三、配置静态 IP四、安…...
Nginx 新增模块 http_image_filter_module 来实现动态生成缩略图
前言 通过 nginx 的 HttpImageFilterModule 模块裁剪过大的图片到指定大小,这个nginx自带的模块是默认关闭的,所以需要重新编译nginx加上此模块。 一、编译 nginx 1.查看 nginx 模块 由于nginx 是之前装好的,这里需要先看一下是否安装了H…...
detach,主线程终止后子线程会结束吗
此前,我对detach的理解是,当主线程退出后,子线程能够继续存在。实际上,当主线程退出后,子线程也随之结束了。先看一个例子: #include <iostream> #include <thread> #include <unistd.h>…...
2023年云计算的发展趋势如何?还值得学习就业吗?
一、2023年云计算的发展将迎来新篇章 随着政策的正式放开,2023年的经济开始慢慢复苏,云计算在疫情期间支撑了复工复产,那么在今年对于云计算发展的限制将进一步的放开。Gartner的数据显示,到2023年,全球公共云支出将达…...
ROS2 入门应用 请求和应答(C++)
ROS2 入门应用 请求和应答(C)1. 创建功能包2. 创建源文件2.1. 服务端2.2. 客户端3. 添加依赖关系4. 添加编译信息4.1. 添加搜索库4.2. 增加可执行文件4.3. 增加可执行文件位置5. 编译和运行1. 创建功能包 在《ROS2 入门应用 工作空间》中已创建和加载了…...
华为机试题:HJ73 计算日期到天数转换(python)
文章目录博主精品专栏导航知识点详解1、input():获取控制台(任意形式)的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() :打印输出。3、整型int() :将指定进制…...
将springboot项目生成可依赖的jar,并引入到项目中
1、将springboot项目生成可依赖的jar包的方法 SpringBoot项目默认打包的是可运行jar包,也可以打包成不可运行的jar包。 能打成可运行的jar包是因为,Spring Boot 项目引入了 spring-boot-maven-plugin 依赖包。 spring-boot-maven-plugin具有repackage …...
小红书搜索关键词布局指南,这4种词一定要把握好
在小红书搜索关键词布局,是提升搜索推流的重要方法,今天跟你讲清楚小红书搜索关键词布局怎么做~做小红书的都知道,小红书的主要流量来源一个是推荐,另一个就是搜索,关键词决定了你的精准人群,那…...
安全研发人员能力模型窥探
能力 是一个比较抽象的概念,不同的行业、管理者、研发人员对能力的认知都会有差异。另外,作为研发团队的相应的职级定级、绩效考核的基础,一个“大家普遍认可”的能力的模型是非常重要的。这是比职级模型更高层的一个基本模型,所谓…...
【面试总结】Linux篇·操作及原理篇
【面试总结】Linux篇原理篇1.介绍一下inode2.说一下Linux系统的目录结构3.说一下Linux系统的文件类型4.如何在Linux上配置一个IP地址5.Linux负载是什么?6.Linux中的软链接和硬链接有什么区别?1.介绍一下inode 硬盘的最小存储单位是扇区(Sector)…...
C++中如何实现用异或运算找出数组中只出现一次的数字???
文章目录1、异或运算符的运算1、异或运算符的运算 问题描述: 给出一个指定的数组,只有一个数出现一次,剩下都出现两次,找出出现一次的数字。指定数组为[1,2,2,1,3,4,3]。 样例输出:4 #include<iostream> using…...
红黑树的历史和由来。
一个数组,1,2,3,4,5,...n; 一共n个数字。1、直接查找想要查询第n个数字,直接搜索,就是n次查询。ps:那么问题来了,这样查询也太慢了,有什么改进的呢?2、二分查找这个时候,二分查找更快。不过就是…...
蓝库云|制造业数字化转型为何转不动?资料处理很重要
数字化转型已经成为每个产业势在必行的课题,没有人会怀疑数字化技术与科技能解放的生产力能量,但为什么看似美好的愿景,实行起来却如此缓慢?蓝库云认为这是因为没有盖好「资料治理」的地基。 面对不断变化的法令规范要求…...
【python学习笔记】 :Lambda 函数
Lambda 函数是 Python 中的匿名函数。有些人将它们简称为lambdas,它们的语法如下: lambda arguments: expressionlambda 关键字可以用来创建一个 lambda 函数,紧跟其后的是参数列表和用冒号分割开的单个表达式。例如,lambda x: 2…...
Nginx的proxy buffer参数设置
1. proxy_buffering 语法:proxy_buffering on|off 默认值:proxy_buffering on 上下文:http,server,location作用:该指令开启从后端被代理服务器的响应body缓冲。 如果proxy_buffering开启,nginx假定被代理的后端服务器会以最…...
SPI简介与实例分析
SPI简介 SPI 协议是由Motorola提出的通讯协议 (Serial Peripheral Interface) ,是一种高速全双工的串行通信总线。 SPI 通讯使用 3 条总线 :SCK、 MOSI、 MISO ,以及若干片选线(SS、CS、NSS)。 主机要和哪个从机通信,就把对应的…...
通过基于pgsql的timescaleDB的time_bucket函数实现自定义聚合粒度
1、自己写的不完全满足要求的实现方式 with tb_tmp as (select *, //计算该时间距离第一天有多少天((extract(epoch from create_time) /3600/24)::integer) as ct_ifrom test.test_salary )select min(a.create_time) as create_time,sum(a.salary) from (select *,//移动数据…...
一台电脑安装26个操作系统(windows,macos,linux)
首先看看安装了哪些操作系统1-4: windows系统 四个5.Ubuntu6.deepin7.UOS家庭版8.fydeOS9.macOS10.银河麒麟11.红旗OS12.openSUSE Leap13.openAnolis14.openEuler(未安装桌面UI)15.中标麒麟(NeoKylin)16.centos17.debian Edu18.fedora19.oraclelinux20.R…...
dockerfile文件
dockerfile文件内容 Form ip端口/centos:regular ENV JAVA_HOME /E:/Program Files/Java/jdk1.8.0_351 ENV PATH $JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 WORKDIR /opt COPY target/fast.jar /op…...
大连网站制作.net/全面落实疫情防控优化措施
想要在uniapp中使用echarts,需要进行以下操作步骤: 一:操作步骤 1.定义存放图表的div; 2.引入echarts.min,js,可以去echarts的官网“在线定制”; 3.在需要使用echarts的图表vue页面引入echarts.min.js; 4.开始使用echarts绘制图表,…...
魔方网站建设/关键词优化
目录:一 Web应用的组成二 开发一个Web应用2.1 S端的简单开发与Http协议2.2 结合http协议改进S端2.3 返回Html2.4 jinja2模块三 Web框架的由来3.1 wsgiref模块3.2 简单Web框架实现3.3 简单web框架的使用3.4 三大web框架简介与wsgi协议一 Web应用的组成 我们接下来学…...
自由贸易试验区网站建设方案/短视频获客系统
1、HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结合SVM分类器已经被广泛应用于图像…...
家在深圳论坛业主论坛/廊坊seo网站管理
在做多语言版本的时候,日期时间的格式话是一个很头疼的事情,幸好Android提供了DateFormate,可以根据指定的语言区域的默认格式来格式化。直接贴代码: public static CharSequence formatTimeInListForOverSeaUser( final Context …...
做医疗网站建设/网络营销推广要求
init()方法中返回的this指向init的实例对象,而init.prototype等于jQuery.prototype,所以也是jQuery的实例对象; 返回this是为了实现链式调用...
洛阳做网站哪家专业/大型门户网站建设
感谢师兄提供的题图!很久之前,在linux下工作,需要多窗口,一般自带的终端能解决这个问题。后来一个Linux很厉害的H师兄,向我推荐了screen,但是没用几次,就不用了。说明,人在接受新事物…...