当前位置: 首页 > 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;所谓…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...