zipfile
是 Python 标准库中的一个模块,用于创建、读取、写入和管理 ZIP 压缩文件。它可以处理文件压缩和解压缩,支持多种模式。以下是 zipfile
模块的一些常用用法及示例:
1. 创建 ZIP 文件并写入内容
zipfile.ZipFile
支持通过 'w'
模式创建 ZIP 文件并写入文件。
import zipfile
# 创建一个新的 ZIP 文件
with zipfile.ZipFile('example.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
zipf.write('file1.txt') # 添加文件 file1.txt
zipf.write('file2.txt') # 添加文件 file2.txt
'w'
表示创建新的 ZIP 文件,如果存在则覆盖。zipfile.ZIP_DEFLATED
是一种压缩方法(常见的还有zipfile.ZIP_STORED
,即不压缩)。
2. 读取 ZIP 文件内容
可以通过 'r'
模式打开 ZIP 文件并查看其中的内容。
with zipfile.ZipFile('example.zip', 'r') as zipf:
print(zipf.namelist()) # 获取 ZIP 文件中的所有文件名
输出示例:
['file1.txt', 'file2.txt']
3. 解压 ZIP 文件
将 ZIP 文件中的所有文件解压到指定目录。
with zipfile.ZipFile('example.zip', 'r') as zipf:
zipf.extractall('output_directory') # 解压到 output_directory 文件夹
你也可以解压单个文件:
with zipfile.ZipFile('example.zip', 'r') as zipf:
zipf.extract('file1.txt', 'output_directory') # 解压 file1.txt 到 output_directory
4. 向现有 ZIP 文件追加文件
使用 'a'
模式可以向已经存在的 ZIP 文件中追加文件,而不会删除已有文件。
with zipfile.ZipFile('example.zip', 'a', zipfile.ZIP_DEFLATED) as zipf:
zipf.write('file3.txt') # 追加 file3.txt
5. 获取 ZIP 文件中的文件信息
你可以使用 getinfo()
函数获取 ZIP 文件中某个文件的详细信息。
with zipfile.ZipFile('example.zip', 'r') as zipf:
info = zipf.getinfo('file1.txt')
print(info.file_size) # 打印文件大小
print(info.compress_size) # 打印压缩后大小
6. 解压 ZIP 文件中的数据到内存中
你可以使用 open()
方法将文件解压到内存中,而不需要写入硬盘。
with zipfile.ZipFile('example.zip', 'r') as zipf:
with zipf.open('file1.txt') as file:
content = file.read()
print(content) # 读取 file1.txt 文件的内容
7. 使用 infolist()
获取所有文件的详细信息
infolist()
返回一个包含所有文件信息的列表。
with zipfile.ZipFile('example.zip', 'r') as zipf:
for info in zipf.infolist():
print(f"File Name: {info.filename}")
print(f"File Size: {info.file_size}")
print(f"Compress Size: {info.compress_size}")
8. 检查文件是否在 ZIP 文件中
使用 testzip()
可以检查 ZIP 文件中的文件是否损坏。
with zipfile.ZipFile('example.zip', 'r') as zipf:
corrupt_file = zipf.testzip()
if corrupt_file:
print(f"Corrupted file found: {corrupt_file}")
else:
print("All files are good.")
9. 创建带有目录结构的 ZIP 文件
如果希望保留文件夹结构,你可以将文件夹递归压缩:
import os
def zipdir(path, zipf):
for root, dirs, files in os.walk(path):
for file in files:
full_path = os.path.join(root, file)
arcname = os.path.relpath(full_path, path) # 保留相对路径
zipf.write(full_path, arcname)
with zipfile.ZipFile('example_with_dirs.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
zipdir('my_folder', zipf)
10. 删除 ZIP 文件中的某个文件
标准库 zipfile
模块不支持直接删除压缩包中的文件。你可以通过以下方式实现:
- 创建一个新的 ZIP 文件。
- 将需要保留的文件从旧 ZIP 文件复制到新 ZIP 文件。
- 不包括需要删除的文件。
import zipfile
def remove_file_from_zip(zip_path, file_to_remove):
temp_zip_path = zip_path + '.tmp'
with zipfile.ZipFile(zip_path, 'r') as zip_in:
with zipfile.ZipFile(temp_zip_path, 'w', zipfile.ZIP_DEFLATED) as zip_out:
for item in zip_in.infolist():
if item.filename != file_to_remove:
zip_out.writestr(item, zip_in.read(item.filename))
os.replace(temp_zip_path, zip_path) # 用新的 zip 文件替换旧的
remove_file_from_zip('example.zip', 'file1.txt')
总结
zipfile
模块提供了丰富的功能,支持文件压缩、解压、读取文件信息等操作。以下是一些常见用法的总结:
- 创建、追加 ZIP 文件:
zipfile.ZipFile('filename.zip', 'w'/'a')
- 解压 ZIP 文件:
extractall()
、extract()
- 查看文件列表:
namelist()
、infolist()
- 读取文件内容:
open()
、read()
- 检查文件是否损坏:
testzip()
这些基本用法涵盖了大部分 ZIP 文件操作的需求。
zipfile.ZIP_DEFLATED
是 zipfile
模块中用于指定压缩方法的常量之一,表示使用 DEFLATE 算法来压缩文件。DEFLATE 是一种广泛使用的压缩算法,也是 ZIP 文件的默认压缩算法。
在创建 ZIP 文件时,ZIP_DEFLATED
选项会压缩文件以减少存储空间,而不是仅仅将文件存储到 ZIP 文件中。
常见压缩方法:
-
**
zipfile.ZIP_DEFLATED
**:- 使用 DEFLATE 压缩算法,最常用的压缩方法,通常可以大大减少文件大小。
- 要求
zlib
模块支持(Python 内置支持zlib
)。
-
**
zipfile.ZIP_STORED
**:- 不进行压缩,只是将文件原样存储在 ZIP 文件中。
- 如果你不需要压缩文件,可以使用此方法。
-
**
zipfile.ZIP_BZIP2
**:- 使用 BZIP2 压缩算法,压缩率比 DEFLATE 更高,但速度较慢。
- 需要 Python 3.3 及以上版本,并且依赖于
bz2
模块。
-
**
zipfile.ZIP_LZMA
**:- 使用 LZMA 压缩算法,压缩率最高,但速度最慢。
- 需要 Python 3.3 及以上版本,并且依赖于
lzma
模块。
使用示例:
import zipfile
# 使用 ZIP_DEFLATED 压缩算法创建 ZIP 文件
with zipfile.ZipFile('compressed.zip', 'w', zipfile.ZIP_DEFLATED) as zipf:
zipf.write('file1.txt') # 压缩并添加 file1.txt
zipf.write('file2.txt') # 压缩并添加 file2.txt
总结:
zipfile.ZIP_DEFLATED
使用了高效的 DEFLATE 算法,能在文件压缩和解压时提供较好的平衡。- 这是大多数情况下默认和推荐使用的压缩方式,因为它压缩效果好,解压速度也较快。