当前位置: 首页 > news >正文

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,主线程终止后子线程会结束吗

此前&#xff0c;我对detach的理解是&#xff0c;当主线程退出后&#xff0c;子线程能够继续存在。实际上&#xff0c;当主线程退出后&#xff0c;子线程也随之结束了。先看一个例子&#xff1a; #include <iostream> #include <thread> #include <unistd.h>…...

2023年云计算的发展趋势如何?还值得学习就业吗?

一、2023年云计算的发展将迎来新篇章 随着政策的正式放开&#xff0c;2023年的经济开始慢慢复苏&#xff0c;云计算在疫情期间支撑了复工复产&#xff0c;那么在今年对于云计算发展的限制将进一步的放开。Gartner的数据显示&#xff0c;到2023年&#xff0c;全球公共云支出将达…...

ROS2 入门应用 请求和应答(C++)

ROS2 入门应用 请求和应答&#xff08;C&#xff09;1. 创建功能包2. 创建源文件2.1. 服务端2.2. 客户端3. 添加依赖关系4. 添加编译信息4.1. 添加搜索库4.2. 增加可执行文件4.3. 增加可执行文件位置5. 编译和运行1. 创建功能包 在《ROS2 入门应用 工作空间》中已创建和加载了…...

华为机试题:HJ73 计算日期到天数转换(python)

文章目录博主精品专栏导航知识点详解1、input()&#xff1a;获取控制台&#xff08;任意形式&#xff09;的输入。输出均为字符串类型。1.1、input() 与 list(input()) 的区别、及其相互转换方法2、print() &#xff1a;打印输出。3、整型int() &#xff1a;将指定进制&#xf…...

将springboot项目生成可依赖的jar,并引入到项目中

1、将springboot项目生成可依赖的jar包的方法 SpringBoot项目默认打包的是可运行jar包&#xff0c;也可以打包成不可运行的jar包。 能打成可运行的jar包是因为&#xff0c;Spring Boot 项目引入了 spring-boot-maven-plugin 依赖包。 spring-boot-maven-plugin具有repackage …...

小红书搜索关键词布局指南,这4种词一定要把握好

在小红书搜索关键词布局&#xff0c;是提升搜索推流的重要方法&#xff0c;今天跟你讲清楚小红书搜索关键词布局怎么做&#xff5e;做小红书的都知道&#xff0c;小红书的主要流量来源一个是推荐&#xff0c;另一个就是搜索&#xff0c;关键词决定了你的精准人群&#xff0c;那…...

安全研发人员能力模型窥探

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

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...