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种词一定要把握好
在小红书搜索关键词布局,是提升搜索推流的重要方法,今天跟你讲清楚小红书搜索关键词布局怎么做~做小红书的都知道,小红书的主要流量来源一个是推荐,另一个就是搜索,关键词决定了你的精准人群,那…...

安全研发人员能力模型窥探
能力 是一个比较抽象的概念,不同的行业、管理者、研发人员对能力的认知都会有差异。另外,作为研发团队的相应的职级定级、绩效考核的基础,一个“大家普遍认可”的能力的模型是非常重要的。这是比职级模型更高层的一个基本模型,所谓…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...