在Python中处理 zip 文件
本文解释了如何使用简单的Python程序对 zip 文件执行各种操作。
什么是 .zip 文件?
ZIP 是一种支持无损数据压缩的存档文件格式。无损压缩是指压缩算法允许从压缩数据中完美重构原始数据。因此,ZIP 文件是包含一个或多个压缩文件的单个文件,提供了一种理想的方法来缩小大文件并将相关文件保存在一起。
为什么我们需要 zip 文件?
- 减少存储需求。
- 提高标准连接的传输速度。
要使用Python处理 zip 文件,我们将使用一个名为 zipfile 的内置Python模块。
1.解压zip文件
# importing required modules
from zipfile import ZipFile
# specifying the zip file name
file_name = "my_python_files.zip"
# opening the zip file in READ mode
with ZipFile(file_name, 'r') as zip:
# printing all the contents of the zip file
zip.printdir()
# extracting all the files
print('Extracting all the files now...')
zip.extractall()
print('Done!')
上面的程序在与此Python脚本相同的目录中提取了一个名为“my_python_files.zip”的 zip 文件。
上述程序的输出可能如下所示:
让我们试着分块理解上面的代码:
from zipfile import ZipFile
ZipFile 是一类用于读写 zip 文件的 zipfile 模块。这里我们只从 zipfile 模块导入类 ZipFile。
with ZipFile(file_name, 'r') as zip:
在这里,通过调用 ZipFile 构造函数来创建一个 ZipFile 对象,该构造函数接受 zip 文件名和模式参数。我们在READ模式下创建一个 ZipFile 对象并将其命名为zip 。
zip.printdir()
printdir()方法打印存档的目录。
zip.extractall()
extractall()方法会将 zip 文件的所有内容提取到当前工作目录。您还可以通过在 zip 文件中指定其路径来调用extract()方法来提取任何文件。
例如:zip.extract('python_files/python_wiki.txt')
这将仅提取指定的文件。
如果你想读一些特定的文件,你可以这样:
data = zip.read(name_of_file_to_read)
2. 写入 zip 文件
考虑一个具有这种格式的目录(文件夹):
在这里,我们需要爬取整个目录及其子目录,以便在将所有文件路径写入 zip 文件之前获取它们的列表。
以下程序通过爬取要压缩的目录来执行此操作:
# importing required modules
from zipfile import ZipFile
import os
def get_all_file_paths(directory):
# initializing empty file paths list
file_paths = []
# crawling through directory and subdirectories
for root, directories, files in os.walk(directory):
for filename in files:
# join the two strings in order to form the full filepath.
filepath = os.path.join(root, filename)
file_paths.append(filepath)
# returning all file paths
return file_paths
def main():
# path to folder which needs to be zipped
directory = './python_files'
# calling function to get all file paths in the directory
file_paths = get_all_file_paths(directory)
# printing the list of all files to be zipped
print('Following files will be zipped:')
for file_name in file_paths:
print(file_name)
# writing files to a zipfile
with ZipFile('my_python_files.zip','w') as zip:
# writing each file one by one
for file in file_paths:
zip.write(file)
print('All files zipped successfully!')
if __name__ == "__main__":
main()
上述程序的输出如下所示:
让我们通过分段来尝试理解上面的代码:
def get_all_file_paths(directory): file_paths = [] for root, directories, files in os.walk(directory): for filename in files: filepath = os.path.join(root, filename) file_paths.append(filepath) return file_paths
首先,为了获取我们目录中的所有文件路径,我们创建了这个使用os.walk()方法的函数。在每次迭代中,该目录中存在的所有文件都附加到名为file_paths的列表中。
最后,我们返回所有文件路径。file_paths = get_all_file_paths(directory)
这里我们将要压缩的目录传递给get_all_file_paths()函数,并获取包含所有文件路径的列表。
with ZipFile('my_python_files.zip','w') as zip:
在这里,我们这次以 WRITE 模式创建一个 ZipFile 对象。
for file in file_paths: zip.write(file)
在这里,我们使用write方法将所有文件一一写入 zip 文件。
3. 获取有关 zip 文件的所有信息
# importing required modules
from zipfile import ZipFile
import datetime
# specifying the zip file name
file_name = "example.zip"
# opening the zip file in READ mode
with ZipFile(file_name, 'r') as zip:
for info in zip.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')
上述程序的输出可能如下所示:
for info in zip.infolist():
在这里, infolist()方法创建了一个ZipInfo类的实例,其中包含有关 zip 文件的所有信息。
我们可以访问所有信息,例如文件的最后修改日期、文件名、创建文件的系统、Zip 版本、压缩和未压缩形式的文件大小等。
本文由Nikhil Kumar提供。如果您喜欢 GeeksforGeeks 并愿意做出贡献,您还可以使用 write.geeksforgeeks.org 撰写文章或将您的文章邮寄至 review-team@geeksforgeeks.org。在 GeeksforGeeks 主页上查看您的文章并帮助其他 Geeks。