Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。
如果你已经使用计算机一段时间,你可能遇到了.zip扩展名的文件。它们是可以保存许多其他文件,文件夹和子文件夹的压缩内容的特殊文件。这种类型的文件在使用互联网传输文件时非常有用。Python也可以用来压缩或解压文件,你知道吗?
本教程将教你如何在Python中使用zipfile模块,同时提取或压缩单个或多个文件。
压缩单个文件
这很容易,而且只需很少的代码。我们先导入zipfile模块,然后通过指定第二个参数为“w”在写模式下打开ZipFile对象。第一个参数是文件本身的路径。代码如下:
请注意,我的所有代码片段中使用了Windows样式格式指定路径;如果您使用的是Linux或Mac,则需要进行相应的更改。
可以指定不同的压缩方法来压缩文件。在Python 3.3版本中添加了新的BZIP2和LZMA方法,但有一些工具还不支持这两种压缩方法。因此,比较安全的用法是使用DEFLATED方法。你仍然可以尝试这些方法来查看压缩文件大小的差异。
压缩多个文件
这稍微有点复杂,因为你需要遍历所有文件。下面的代码展示了如何压缩指定文件夹下的所有扩展名为pdf的文件:
这一次,我们导入了os模块,并使用它的walk()方法来遍历所有文件和子文件夹,并且只压缩pdf文件。你可以使用if语句为每种格式创建不同的归档文件。
如果不想保留目录结构,可以使用以下行将所有文件放在一起:
write()方法接受三个参数:第一个参数是我们要压缩的文件的名称;第二个参数是可选的,可以为压缩文件指定不同的文件名;如果未指定任何内容,则使用默认名称。
提取所有文件
你可以使用extractall()方法将所有文件和文件夹从zip文件解压缩到当前目录。你还可以将文件夹名称传递给extractall(),以解压缩特定目录中的所有文件和文件夹。如果文件夹不存在,此方法将会自动创建。代码如下:
如果想提取其中的多个文件,需要提供包含文件名称的列表。
提取单个文件
和提取多个文件相似。区别是,这次你需要指定文件名和解压目录;需要使用extract()方法,而不是extractall()。下面是一个提取单个文件的代码片段:
读取Zip文件
考虑以下场景:你需要查看zip存档是否包含特定文件。到目前为止,你唯一的选择是通过解压所有文件。同样,你也可能只提取大于特定大小的文件。其实zipfile模块允许我们查询存档的内容,而不必提取它。
使用ZipFile对象的namelist()方法将按名称返回归档的所有成员的列表。要获取档案中特定文件的信息,可以使用ZipFile对象的getinfo()方法。这将允许您访问特定文件的信息,例如文件的压缩前后的大小或其上次修改时间。
当有很多文件需要处理时,对所有文件逐个调用getinfo()方法可能是一个令人讨厌的过程。在这种情况下,可以使用infolist()方法返回包含归档中每个成员的ZipInfo对象的列表。列表中这些对象的顺序与实际zip文件的顺序相同。
您还可以使用read(file)方法从归档中直接读取特定文件的内容,其中file是要读取的文件的名称。为此,必须以读取或追加模式打开归档。
要从归档中获取单个文件的压缩大小,可以使用compress_size属性。同样,要知道未压缩的大小,可以使用file_size属性。
以下代码使用刚才讨论的属性和方法来提取大小低于1MB的文件。
要知道归档中特定文件最后修改的时间和日期,可以使用date_time属性。这将返回一个包含六个值的元组,分别对应年、月、日、日、时、分、秒。年份总是大于或等于1980,时、分、秒是从零计算的。
有关原始文件大小和压缩文件大小的信息可以帮助您决定是否值得压缩文件。我相信它可以用于其他一些场景。
最后的想法
从本教程中能看到,使用zipfile模块来压缩文件有很大的灵活性。可以根据类型、名称或大小将目录中的不同文件压缩到不同的归档。你还可以决定是否要保留目录结构。同样,在提取文件时,您可以根据自己的标准,如大小等,将它们提取到所需的位置。
实际上,通过编写我自己的代码来压缩和提取文件也是非常令人兴奋的。我希望你喜欢的教程,如果你有任何问题,请让我知道的意见。
英文原文:https://code.tutsplus.com/tutorials/compressing-and-extracting-files-in-python--cms-26816
译者:奇迹