首页 > 其他分享 >zipfile用法

zipfile用法

时间:2024-09-23 22:50:58浏览次数:3  
标签:文件 ZIP ZipFile zipfile zipf 用法 path

zipfile 模块是 Python 标准库的一部分,提供了用于创建、读取、写入、解压缩 ZIP 文件的功能。你在上面的代码中主要使用了 zipfile.ZipFile 类来创建和操作 ZIP 文件。以下是详细解释你代码中的 zipfile 模块用法,以及进一步的扩展。

1. 基本概念

  • zipfile.ZipFile 类用于创建和操作 ZIP 文件。
  • ZIP 文件 是一种压缩文件格式,能够将多个文件或文件夹压缩成单个文件,同时保留文件的目录结构。

2. 你使用到的功能解释

2.1 创建 ZIP 文件

with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:
    ...
  • zipfile.ZipFile(): 这是一个类,用于打开一个 ZIP 文件。它可以在多种模式下打开文件,如只读模式 'r'、写入模式 'w'、追加模式 'a' 等。
  • zip_name: 这是你要创建的 ZIP 文件的名称(包括路径)。
  • 'w': 表示写入模式,意味着会创建一个新的 ZIP 文件。如果文件已存在,它将被覆盖。
  • zipfile.ZIP_DEFLATED: 这是压缩算法,表示使用 deflate 压缩方法来压缩文件,这是 ZIP 文件的常见压缩算法。

通过 with 语句,Python 确保当代码块执行完毕时,ZIP 文件会被正确关闭,避免资源泄露。

2.2 向 ZIP 文件添加文件

zipf.write(full_path, arcname)
  • write(): 将文件添加到 ZIP 文件中。
    • full_path: 被压缩的文件的完整路径。
    • arcname: 在 ZIP 文件中保存的文件路径(相对路径)。通过指定相对路径,可以保留文件的目录结构。

2.3 保留目录结构

arcname = os.path.relpath(full_path, base_path)
  • os.path.relpath(): 返回 full_path 相对于 base_path 的相对路径。这使得在 ZIP 文件中能够保留文件的原始目录结构。

2.4 关闭 ZIP 文件

with zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED) as zipf:

在这里使用 with 语句,Python 会自动在块结束时关闭 ZIP 文件。如果没有使用 with 语句,你需要手动调用 zipf.close() 来关闭文件。

3. zipfile 的其他常用功能

3.1 读取 ZIP 文件内容

你可以读取 ZIP 文件的内容,例如列出 ZIP 文件中的所有文件。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    zipf.printdir()
  • printdir(): 打印 ZIP 文件中的所有文件及其相关信息,如文件大小、压缩方式等。

3.2 解压 ZIP 文件

你可以解压 ZIP 文件中的所有文件或单个文件。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    # 解压所有文件到当前目录
    zipf.extractall()

    # 解压特定文件
    zipf.extract('test/task/file.txt', '/path/to/extract')
  • extractall(): 解压 ZIP 文件中的所有内容。
  • extract(name, path): 解压 ZIP 文件中的某个文件 namepath 指定的目录。

3.3 追加文件到现有 ZIP 文件

如果你想在已经存在的 ZIP 文件中添加文件,可以使用 'a' 模式:

with zipfile.ZipFile(zip_name, 'a', zipfile.ZIP_DEFLATED) as zipf:
    zipf.write('/path/to/newfile.txt', 'newfile.txt')
  • 'a' 模式: 追加模式,不会覆盖已存在的 ZIP 文件,而是往其中添加新的文件。

3.4 查看 ZIP 文件中的文件列表

你可以列出 ZIP 文件中的所有文件:

with zipfile.ZipFile(zip_name, 'r') as zipf:
    file_list = zipf.namelist()
    print(file_list)
  • namelist(): 返回 ZIP 文件中所有文件的名称列表。

3.5 检索 ZIP 文件中的文件信息

可以获取 ZIP 文件中各个文件的详细信息,例如文件大小、压缩大小等。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    for info in zipf.infolist():
        print(info.filename, info.file_size, info.compress_size)
  • infolist(): 返回 ZIP 文件中每个文件的 ZipInfo 对象。
  • ZipInfo: 包含文件的详细信息,如 filename(文件名)、file_size(原始大小)、compress_size(压缩后大小)等。

3.6 检查文件是否在 ZIP 中

你可以使用 getinfo() 来检查 ZIP 文件中是否存在某个文件。

with zipfile.ZipFile(zip_name, 'r') as zipf:
    try:
        info = zipf.getinfo('test/task/file.txt')
        print("File found:", info.filename)
    except KeyError:
        print("File not found in ZIP")
  • getinfo(): 返回 ZIP 文件中指定文件的 ZipInfo 对象。如果文件不存在,会引发 KeyError 异常。

3.7 压缩不同类型的文件

zipfile 模块不仅支持文本文件,还支持压缩图片、视频等二进制文件:

with zipfile.ZipFile('media_files.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
    zipf.write('image.png')
    zipf.write('video.mp4')

3.8 设置 ZIP 文件的密码

虽然 zipfile 模块支持压缩和解压文件,但不直接支持设置密码。如果你想为 ZIP 文件加密,通常需要使用第三方库如 pyminizip7-Zip

# 使用 7-Zip 命令行加密 ZIP 文件
7z a -pYourPassword secure.zip file_to_compress.txt

总结

zipfile 模块提供了丰富的功能来创建、读取、解压和操作 ZIP 文件。结合你当前的需求,这些功能允许你:

  1. 压缩多个文件并保持目录结构。
  2. 编译 Python 文件并将 .pyc 文件添加到 ZIP 中。
  3. 读取 ZIP 文件的内容并解压文件。

通过拓展功能,你还可以:

  • 检查 ZIP 文件的详细信息。
  • 追加文件到现有 ZIP 文件。
  • 压缩和解压更多类型的文件。

标签:文件,ZIP,ZipFile,zipfile,zipf,用法,path
From: https://blog.51cto.com/u_16420155/12092183

相关文章

  • Android Studio 快捷用法
    AndroidStudio快捷用法路一直都在   原文链接    2017年03月10日发布AndroidStudio已经用了两年左右了,对快捷键的使用一直如同段誉的六脉神剑一般,偶尔会biu不出来,从来没有静下心来耐心的看完Tips,为了避免这种尴尬,决定把Tips完整的练习一遍并记录在案。......
  • window.location.href和window.open的几种用法和区别
    window.location.href和window.open的几种用法和区别2017年05月26日09:47:40阅读数:823阅读目录一、location.href常见的几种形式二、location.href不同形式之间的区别三、location.href总结四、window.location.href和window.open的区别使用js的同学一定知道j......
  • Python NumPy处理数组的基本用法代码示例
    NumPy是一个用于处理数组(向量和矩阵)以及进行数值运算的Python库。下面是一些简单的例子来展示如何使用NumP:示例1:创建数组importnumpyasnpa=np.array([1,2,3])#创建一个一维数组b=np.array([[1,2,3],[4,5,6]])#创建一个二维数组print(a)print(b)示......
  • QTableWidget用法总结
    QTableWidget用法总结直接上代码mainwindow.h#ifndefMAINWINDOW_H#defineMAINWINDOW_H#include<QMainWindow>#include<QDateTime>#include<QScrollBar>#include<QFile>#include<QIODevice>QT_BEGIN_NAMESPACEnamespaceUi{class......
  • Django 路由层 —— 基础用法,以及底层如何实现的
    路由层负责网页URL与函数/类的对应关系用法基本用法urls.py:urlpatterns=[#基本用法path('login/',views.login),#动态输入参数path('info/<int:v1>',views.info),#可以同时传多个参数,path:v3会记录v1-v2/后面的所有路径......
  • struct的精确用法
    目录我终于回来啦!1,可以创造根据结构体格式的成员或数组。普通成员 数组成员2,可以用指针遍历成员3,使用typedef---------------------------------------------------------------------------------------------------------------------------------今天我整理了一......
  • node nvm 基础用法
    NVM(NodeVersionManager)是一个用于管理多个Node.js版本的工具。它允许你在同一台机器上安装和切换不同版本的Node.js,而不会相互干扰。以下是NVM的一些基础用法:安装NVM:在Linux或macOS上,你可以使用CURL或WGET来安装NVM。例如,使用CURL:curl-o-https://raw.githubuserconte......
  • Excel--DATEDIF函数的用法及参数含义
    DATEDIF函数的用法为:DATEDIF(start_date,end_date,unit),start_date表示的是起始时间,end_date表示的是结束时间。unit表示的是返回的时间代码,是天、月、年等。如下:Datedif函数的参数含义unit参数返回值的意义"y"两个时间段之间的整年数"m"两个时间段之间的整月数"d"两个时......
  • python关于pymysql 执行sql语句in的用法
    今天在执行python代码中发现一个有意思的事,直接看代码注意如下红色部分name='张三'ids=1,2,3sql="selectNAME,NUM,SEXfromTEMP_TWHERENAME=%sandidin(%s)"param=(name,ids)cursor.execute(sql,param) 发现实际执行的sql语句是:selectNAM......
  • saltstack高级用法
    一、saltstack的高级用法 一、job管理1、job简介Jid:jobid,格式为%Y%m%d%H%M%S%fmaster在下发指令消息时,会附带上产生的Jid,minion在接收到指令开始执行时,会在本地的cachedir(默认是/var/cache/salt/minion/)下的proc目录产生以Jid命名的文件,用于在执行过程中master查看当......