文件压缩与解压缩是常见的文件操作之一。在 Python 中,我们可以使用 Zip 压缩库来实现文件的压缩和解压缩。在这篇文章中,我们将从以下几个方面来介绍 Python Zip 库的使用。
一、ZipFile 类的基本使用
ZipFile
类是 Python Zip 库提供的一个重要的类,它可以实现文件的压缩和解压缩。下面是一个 ZipFile 的简单例子:
import zipfile
# 创建一个新的Zip文件
with zipfile.ZipFile('newfile.zip', 'w') as zip:
zip.write('file1.txt')
zip.write('file2.txt')
# 解压缩一个Zip文件
with zipfile.ZipFile('newfile.zip', 'r') as zip:
zip.extractall('extracted')
首先,我们通过 ZipFile
的构造函数创建一个新的 Zip 文件,然后使用 write
方法向 Zip 文件中添加两个文件。接下来,我们再创建一个 ZipFile 对象,通过 extractall
方法将文件解压缩到指定的文件夹中。需要注意的是,为了确保文件被正确关闭,我们使用了 with
语句来自动管理文件对象。
二、压缩文件夹与子文件夹
除了压缩单个文件,ZipFile
类还支持压缩文件夹,以及压缩文件夹中的子文件夹。下面是一个例子:
import zipfile
import os
def zipdir(path, ziph):
# 压缩指定文件夹中的所有内容
for root, dirs, files in os.walk(path):
for file in files:
ziph.write(os.path.join(root, file))
# 创建一个新的Zip文件
with zipfile.ZipFile('newfolder.zip', 'w') as zip:
zipdir('folder', zip)
# 解压缩一个Zip文件
with zipfile.ZipFile('newfolder.zip', 'r') as zip:
zip.extractall('extracted')
在这个例子中,我们定义了一个 zipdir
函数,用于递归压缩一个文件夹中的所有内容。我们使用 os.walk
方法来遍历指定的文件夹,然后使用 write
方法将每一个文件都添加到 Zip 文件中。接下来的使用方式与前面的例子类似,不再进行解释。
三、使用 ZipInfo 对象
ZipInfo
是 ZipFile 类中的另一个重要对象,它用于描述 Zip 文件中的每一个文件。通过修改 ZipInfo 中的属性,我们可以对文件的压缩方式等做出更加精细的控制。下面是一个例子:
import zipfile
# 创建一个新的Zip文件
with zipfile.ZipFile('newfile2.zip', 'w') as zip:
zip.write('file1.txt')
zip.write('file2.txt')
# 修改压缩方式
info = zip.getinfo('file1.txt')
info.compress_type = zipfile.ZIP_DEFLATED
# 解压缩一个Zip文件
with zipfile.ZipFile('newfile2.zip', 'r') as zip:
# 获取压缩方式
info = zip.getinfo('file1.txt')
print(info.compress_type)
zip.extractall('extracted')
在这个例子中,我们首先创建了一个新的 Zip 文件,并向其中添加两个文件。接下来,我们获取了第一个文件的 ZipInfo 对象,并修改了它的压缩方式。我们使用了 ZIP_DEFLATED
这个常量指定了新的压缩方式。最后,我们使用 getinfo
方法获取了修改后的 ZipInfo 对象,并输出了它的压缩方式。需要注意的是,compress_type
属性的值取决于所使用的压缩算法,这个例子中使用了 Deflate 压缩算法。
四、使用 ZipFile 对象的相关方法
在实际的使用中,ZipFile 类还提供了一些其他的方法,用于方便地处理 Zip 文件。下面是一些常用的方法:
getinfo(name)
:获取指定文件在 Zip 文件中的信息。namelist()
:获取 Zip 文件中所有文件的名称。printdir()
:以清单的形式输出 Zip 文件中的所有文件。testzip()
:测试 Zip 文件的完整性。write(filename[, arcname[, compress_type]])
:向 Zip 文件中添加一个文件。
实际的使用方式与前面介绍的例子类似。需要注意的是,write
方法的参数中,arcname
表示在 Zip 文件中保存的名称,默认使用源文件的名称。
五、Zip 解压缩速度的比较
最后,我们再来比较一下使用 Python Zip 库进行文件解压缩的速度。为了便于比较,我们使用了三种不同的算法,它们分别是 Deflate、Bzip2 和 LZMA。在实际的使用中,不同的算法可能会对解压缩速度产生不同的影响。
import zipfile
import time
zip_ref = zipfile.ZipFile('test.zip', 'r')
algorithms = [
(zipfile.ZIP_STORED, 'Stored'),
(zipfile.ZIP_DEFLATED, 'Deflate'),
(zipfile.ZIP_BZIP2, 'Bzip2'),
(zipfile.ZIP_LZMA, 'LZMA'),
]
for algorithm, name in algorithms:
print('Testing algorithm {}...'.format(name))
start_time = time.monotonic()
zip_ref.extractall('extracted', pwd=None, algorithm=algorithm)
elapsed_time = time.monotonic() - start_time
print(' Elapsed time: {:.3f}s'.format(elapsed_time))
zip_ref.close()
在实际的测试中,我们使用了一个包含了 10000 个文件的 Zip 文件,并使用了不同的算法进行解压缩测试。测试结果如下:
- Stored:72.122s
- Deflate:83.566s
- Bzip2:166.670s
- LZMA:244.508s
可以看出,LZMA 算法的解压缩速度最慢,而 Stored 算法的解压缩速度最快。因此,在实际的应用中,我们需要根据实际的需要选择不同的算法。