📜  在Python中处理 zip 文件

📅  最后修改于: 2022-05-13 01:55:32.589000             🧑  作者: Mango

在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。