Python 神器 zipfile 模块:一键解锁解压、备份数据超能力
Python 提供了一个 zipfile 模块,可简化 ZIP 压缩文件操作。在本文中,将介绍在 Python 中使用 zipfile 模块解压缩文件的方法。
可以使用 Python 脚本来自动备份重要数据。通过使用 zipfile 模块,将多个文件和目录压缩到备份路径,实现数据备份。
创建 ZIP 压缩文件
zipfile.ZipFile() 方法:
以指定的模式打开 ZIP 文件。模式包括读取 ('r')、写入 ('w')、附加 ('a') 等。如果压缩文件不存在则自动创建文件。
zipfile.write() 方法:
将文件写入 ZIP 压缩文件。
import zipfile
with zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED) as zip_file:
zip_file.write('1.txt', arcname='files/file1.txt')
zip_file.write('2.txt', arcname='files/file2.txt')
print("ZIP文件:'archive.zip' 创建成功")
以上示例,将1.txt、2.txt 两个文件压缩到 archive.zip 文件。其中参数 arcname 为指定存档名称路径,即将1.txt、2.txt 两个文件改名为 file1.txt、file2.txt 存放到 file 文件夹并压缩。
向 ZIP 添加文件
如果将文件添加到已存在的 zip 压缩文件中,需要使用 write() 方法的附加模式('a'),因为写入 模式('w')会重建覆盖现有压缩文件。
import zipfile
with zipfile.ZipFile('archive.zip', 'a', zipfile.ZIP_DEFLATED) as zip_file:
zip_file.write('3.txt')
zip_file.write('4.txt')
print("ZIP文件:'archive.zip' 创建成功")
压缩指定路径的所有文件
import os
import zipfile
def zip_folder(folder_path, output_zip_path):
# 创建一个 ZipFile 对象
with zipfile.ZipFile(output_zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
# 遍历指定文件夹中的所有文件
for root, dirs, files in os.walk(folder_path):
for file in files:
# 获取文件的完整路径
file_path = os.path.join(root, file)
# 将文件添加到 ZIP 文件中,使用相对于指定文件夹的相对路径
arcname = os.path.relpath(file_path, start=folder_path)
zipf.write(file_path, arcname)
# 指定要压缩的文件夹路径和输出的 ZIP 文件路径
folder_to_zip = 'file/'
output_zip = 'archive.zip'
# 调用函数进行压缩
zip_folder(folder_to_zip, output_zip)
以上示例,将当前路径中 file 文件夹中的所有文件压缩到 archive.zip 压缩文件中。
解压 ZIP 文件
将所有文件从 archive.zip 解压到名为 file 的文件夹中。
使用读取模式 ('r') 打开现有的 ZIP 文件。
ZipFile.extractall() 方法:
将 ZIP 文件中的所有文件提取到指定路径。
import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zip_file:
zip_file.extractall('file')
print("解压文件成功。")
将指定文件从 archive.zip 中解压。
ZipFile.extract() 方法:
将 ZIP 文件中的单个文件解压到指定路径。
import zipfile
with zipfile.ZipFile('archive.zip', 'r') as zip_file:
zip_file.extract('1.txt', 'file')
print("解压文件成功。")
从 ZIP 文件删除文件
ZipFile.read() 方法:
读取文件内容。
ZipFile.writestr() 方法:
将字符串数据写入文件。
zip_file.namelist() 方法:
压缩文件中所有文件名列表
import zipfile
import os
with zipfile.ZipFile('archive.zip', 'r') as zip_file:
all_files = zip_file.namelist() # 获取压缩文件中文件列表
# 生成保留文件列表
files_to_keep = [file for file in all_files if file != '2.txt']
# 将保留文件压缩到新压缩文件
with zipfile.ZipFile('archive2.zip', 'w', zipfile.ZIP_DEFLATED) as new_zip_file:
for file in files_to_keep:
data = zip_file.read(file)
new_zip_file.writestr(file, data)
获取 ZIP 文件的信息
from zipfile import ZipFile
import datetime
file_name = "archive.zip"
with ZipFile(file_name, 'r') as zip_file:
for info in zip_file.infolist():
print(info.filename)
print('\tModified:\t' + str(datetime.datetime(*info.date_time)))
print('\tSystem:\t\t' + str(info.create_system) + '(0 = Windows, 3 = Unix)')
print('\tZIP version:\t' + str(info.create_version))
print('\tCompressed:\t' + str(info.compress_size) + ' bytes')
print('\tUncompressed:\t' + str(info.file_size) + ' bytes')
运行结果:
files/file1.txt
Modified: 2024-12-27 16:56:16
System: 0(0 = Windows, 3 = Unix)
ZIP version: 20
Compressed: 6 bytes
Uncompressed: 4 bytes
files/file2.txt
Modified: 2024-12-27 16:56:24
System: 0(0 = Windows, 3 = Unix)
ZIP version: 20
Compressed: 5 bytes
Uncompressed: 5 bytes