在Python中使用zip文件

本文解释了如何使用简单的python程序对zip文件执行各种操作。

null

什么是压缩文件?

ZIP是一种支持无损数据压缩的归档文件格式。所谓无损压缩,我们的意思是压缩算法允许从压缩数据中完美地重建原始数据。因此,ZIP文件是包含一个或多个压缩文件的单个文件,它提供了一种理想的方法,可以使大文件变小,并将相关文件放在一起。

为什么我们需要压缩文件?

  • 以减少存储需求。
  • 以提高标准连接的传输速度。

为了使用python处理zip文件,我们将使用一个名为 zipfile .

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文件。 上述程序的输出可能如下所示:

图片[1]-在Python中使用zip文件-yiteyi-C++库

让我们试着分块理解上面的代码:

  • from zipfile import ZipFile

    ZipFile是一类ZipFile模块,用于读取和写入zip文件。这里我们只从ZipFile模块导入类ZipFile。

  • with ZipFile(file_name, 'r') as zip:

    这里,ZipFile对象是通过调用ZipFile构造函数生成的,该构造函数接受zip文件名和模式参数。我们在中创建一个ZipFile对象 阅读 模式并将其命名为 拉链 .

  • zip.printdir()

    printdir() 方法打印存档的目录。

  • zip.extractall()

    拔取 方法将zip文件的所有内容提取到当前工作目录。你也可以打电话 摘录() 方法通过在zip文件中指定其路径来提取任何文件。 例如:

    zip.extract('python_files/python_wiki.txt')

    这将仅提取指定的文件。

    如果你想读一些特定的文件,你可以这样做:

    data = zip.read(name_of_file_to_read)

2.写入zip文件

考虑具有这样一种格式的目录(文件夹):

图片[2]-在Python中使用zip文件-yiteyi-C++库

在这里,我们需要对整个目录及其子目录进行爬网,以便在将它们写入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()


上述程序的输出如下所示:

图片[3]-在Python中使用zip文件-yiteyi-C++库

让我们试着通过将代码分成几个片段来理解上面的代码:

  • 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

    首先,为了获取目录中的所有文件路径,我们创建了这个函数,它使用 操作系统。步行 方法在每次迭代中,该目录中的所有文件都会附加到一个名为 文件路径 . 最后,我们返回所有文件路径。

  • file_paths = get_all_file_paths(directory)

    在这里,我们传递要压缩到 获取所有文件路径() 函数并获取包含所有文件路径的列表。

  • with ZipFile('my_python_files.zip','w') as zip:

    这里,我们这次在写模式下创建一个ZipFile对象。

  • for file in file_paths:
                zip.write(file)

    在这里,我们使用 方法

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 ( ' Modified: ' + str (datetime.datetime( * info.date_time)))
print ( ' System: ' + str (info.create_system) + '(0 = Windows, 3 = Unix)' )
print ( ' ZIP version: ' + str (info.create_version))
print ( ' Compressed: ' + str (info.compress_size) + ' bytes' )
print ( ' Uncompressed: ' + str (info.file_size) + ' bytes' )


上述程序的输出可能如下所示:

图片[4]-在Python中使用zip文件-yiteyi-C++库

for info in zip.infolist():

在这里 信息列表() 方法创建 ZipInfo 类,该类包含有关zip文件的所有信息。 我们可以访问所有信息,如文件的最后修改日期、文件名、创建文件的系统、Zip版本、压缩和未压缩格式的文件大小等。

本文由 尼希尔·库马尔 .如果你喜欢GeekSforgeks并想贡献自己的力量,你也可以用write写一篇文章。极客。组织或邮寄你的文章进行评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享