压缩文件 zipfile
Python 的标准函数“zipfile”提供可以将文件或文件夹压缩为 zip 压缩档、或将压缩档解压缩的方法,这篇教学将会介绍 zipfile 的使用方法。
快速导览:
- 本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
- 如果使用 Colab,需要和 Google 云端硬盘连动,请参考:连动 Google Drive
import zipfile
要使用 zipfile 必须先 import zipfile 模组,或使用 from 的方式,单独 import 特定的类型。
import zipfile
from zipfile import ZipFile
压缩文件
ZipFile() 是 zipfile 函数库里最常使用的方法,将 ZipFile() 的 mode 参数设定为“w”,就能压缩文件或文件夹,下方的程序码执行后,会将两张图片压缩为一个名叫 test.zip 的压缩档,当中使用 with...as 的语法,压缩完成后就会关闭压缩的流程。
ZipFile() 方法里还有 compression 参数,可以设定压缩成 zip 的压缩方法,通常不需要进行设定,如果需要设定可以参考:ZipFile 对象
- 注意,要压缩的文件路径采用和 Python 执行档的相对路径,范例中的文件和 Python 执行档放在同一个文件夹中。
- 虽然 zipfile 函数库有提供 setpassword 的方法,但根据官方说明,该方法只能取得密码,无法设定密码。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
with zipfile.ZipFile('test.zip', mode='w') as zf:
zf.write('oxxo1.jpg')
zf.write('oxxo2.jpg')
如果不使用 with...as 语法,也可使用下方的程序码,压缩完成后再透过 close() 方法关闭压缩流程。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
import zipfile
zf = zipfile.ZipFile('test.zip', mode='w')
zf.write('mona.jpg')
zf.write('mona2.jpg')
zf.write('../bg4.jpg')
zf.close()
在压缩档内添加文件
如果将 FileZip() 方法的模式设定为“a”,就可以在现成的压缩档中添加文件,下方的程序码执行后,会在原本的 test.zip 里,添加一张名为 orange.jpg 的图片。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
import zipfile
with zipfile.ZipFile('test.zip', mode='a') as zf:
zf.write('orange.jpg')
读取压缩档内的文件
果将 FileZip() 方法的模式设定为“r”,就可以单纯读取压缩档,下方列出读取压缩档后的操作方法:
| 方法 | 参数 | 说明 |
|---|---|---|
| namelist() | 列出压缩档的所有内容名称。 | |
| infolist() | 列出压缩档的所有内容信息。 | |
| getinfo() | name | 列出指定文件的信息。 |
执行 getinfo() 之后,就可以按照下表,取出该文件常用的属性:
| 属性 | 说明 |
|---|---|
| filename | 文件名称。 |
| date_time | 文件修改时间。 |
| compress_type | 压缩型别。 |
| compress_size | 压缩后的大小。 |
| file_size | 文件原本大小。 |
| comment | 文件说明。 |
| create_system | 建立压缩档的系统信息。 |
| create_version | 建立压缩档的版本。 |
| extract_version | 解压缩的所需版本。 |
下方的程序码执行后,会从 test.zip 压缩档中,列出内容的文件清单,接着会印出其中一个文件的档名、大小与压缩后的大小。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
import zipfile
with zipfile.ZipFile('test.zip', mode='r') as zf:
print(zf.namelist()) # 印出清單
img1 = zf.getinfo('oxxo1.jpg') # 取得檔案資訊
print(img1.filename) # 印出名稱
print(img1.file_size) # 印出原始大小
print(img1.compress_size) # 印出壓縮後的大小
解压缩文件 ( 支援有密码的压缩档 )
读取压缩档后,就可以使用 extract() 方法进行解压缩的动作,使用方法如下:
zf.extract(name, path, pwd)
# name 要解壓縮的檔案名稱
# path 解壓縮後要放的位置
# pwd 解壓縮密碼
下方的程序码执行后,会将一个具有 123 密码的压缩档,解压缩后放到 zipfolder 的文件夹中。
- 解压缩路径使用 r 开头,可以避免一些斜线字元被转义。
- 密码后方要加上 encode('utf-8') 才会是 utf-8 文字字元。
import os
os.chdir('/content/drive/MyDrive/Colab Notebooks') # 針對 Colab 改變路徑,本機環境可不用
import zipfile
with zipfile.ZipFile('test.zip', mode='r') as zf:
nameList = zf.namelist()
for name in nameList:
zf.extract(name, r'zipfolder', pwd='123'.encode('utf-8'))
微信扫码关注
抖音扫码关注