解壓縮模塊 zipfile

zipfile

一、創建一個ZipFile對象,表示一個zip文件

class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])

參數file表示文件的路徑或類文件對象(file-like object)

參數mode指示打開zip文件的模式,默認值爲'r',表示讀已經存在的zip文件,也可以爲'w'或'a','w'表示新建一個zip文檔或覆蓋一個已經存在的zip文檔,'a'表示將數據附加到一個現存的zip文檔中。

參數compression表示在寫zip文檔時使用的壓縮方法,它的值可以是zipfile. ZIP_STORED 或zipfile. ZIP_DEFLATED。

如果要操作的zip文件大小超過2G,應該將allowZip64設置爲True。

二、常用功能

zipfile裏有兩個非常常用的class, 分別是ZipFile和ZipInfo,ZipFile用來創建和讀取zip文件,ZipInfo是存儲的zip文件的每個文件的信息的

1、zipfile.is_zipfile(filename)

判斷一個文件是否爲壓縮文件

2、ZipFile.namelist()

獲取zip文檔內所有文件的名稱列表

import zipfile
f = zipfile.ZipFile(filename, 'r')    #r表示是讀取zip文件,w或a是創建一個zip文件

for f_name in f.namelist(): #.namelist() 返回壓縮包內所有文件名的列表
    print(f_name)

3、ZipFile.extract(member[, path[, pwd]])

將zip文檔內的指定文件解壓到當前目錄。參數member指定要解壓的文件名稱或對應的ZipInfo對象;參數path指定了解析文件保存的文件夾;參數pwd爲解壓密碼

import zipfile, os
f = zipfile.ZipFile(os.path.join(os.getcwd(), 'duoduo.zip'))  #拼接成一個路徑
for file in f.namelist():
  f.extract(file, r'd:/Work')     #在d:/Work中解壓文件
f.close()

三、循環解壓

該代碼能遍歷壓縮包中的文件夾,遇到子壓縮包,能夠再次解壓,直到解壓完所有子壓縮包。

“參數”的作用是:不刪除原始壓縮包,而刪除所有子壓縮包

import os, zipfile


class UnZip():
    def scan(self, source_dir):
        files = os.listdir(source_dir)
        n = 0
        for sub_file in files:
            n += 1
            sub_file_path = os.path.join(source_dir, sub_file)
            if os.path.isdir(sub_file_path):
                self.scan(sub_file_path)
            else:
                if sub_file_path.lower().endswith('.zip'):
                    print('hi')
                    output_sub_dir = sub_file_path[:-4]
                    self.unzip(sub_file_path, output_sub_dir)
                    self.scan(output_sub_dir)
                    if n != 1:
                        os.remove(sub_file_path)

    def unzip(self, file, folder):
        fz = zipfile.ZipFile(file, 'r')
        for sub_file_name in fz.namelist():
            fz.extract(sub_file_name, folder)


if __name__ == '__main__':
    UnZip().scan(r'D:\Projects\CA\script')

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章