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
譯者:奇跡