python zipfile 模組基礎使用及demo
阿新 • • 發佈:2022-04-15
zipfile 模組相關介面 參考自這裡
# 列印該歸檔檔案的內容 printdir() # 從歸檔檔案中展開一個成員到當前工作目錄,memeber必須是一個完整的檔名稱或者ZipInfo物件,path可以用來指定一個不同的展開目錄,pwd用於加密檔案的密碼 extract(memeber, path=None, pwd=None) # 從歸檔檔案展開所有成員到當前工作目錄,path和pwd引數作用同上,memebers必須是namelist()返回的list的一個子集 extractall(path=None, members=None, pwd=None) # 返回一個與每一個歸檔成員對應的ZipInfo物件的列表 infolist() # 返回歸檔成員名稱列表 namelist() # 返回一個包含壓縮成員name相關資訊的ZipInfo物件,如果name沒有被包含在該壓縮文件中將會引發KeyError getinfo(name) # 將歸檔檔案中的一個成員作為一個file-like物件展開;name是歸檔檔案中的檔名或者一個ZipInfo物件 open(name, mode='r', pwd=None) # 關閉該壓縮檔案;退出程式前必須呼叫close()方法,否則一些必要記錄不會被寫入 close() # 設定pwd作為展開加密檔案的預設密碼 setpassword(pwd) # 讀取歸檔檔案中所有檔案並檢查它們的完整性,返回第一個被損壞的檔名稱,或者None。對已關閉的ZipFile呼叫testzip()將會引發RuntimeError testzip() # 返回歸檔檔案中name所指定的成員檔案的位元組。name是歸檔檔案中的檔名稱或一個ZipInfo物件。該歸檔檔案必須以讀(r)或追加(a)的模式開啟。如果設定了pwd引數,則其將會覆蓋setpassword(pwd)方法設定的預設密碼。對一個已經關閉的ZipFile呼叫read()方法將會引發RuntimeError read(name, pwd=Noneds) # 將filename檔案寫入歸檔檔案,可以通過arcname指定新檔名(需要注意的是檔名中磁碟碟符和開頭的路徑分隔符都會被移除);compress_type表示壓縮方法,如果指定了該引數則會覆蓋ZipFile構造方法中的compression引數指定的值;要呼叫此方法,歸檔檔案必須以'w', 'a'或'x'模式開啟,如果對以'r'模式開啟的ZipFile呼叫write()方法或者對已關閉的ZipFile呼叫write()方法將會引發RuntimeError write(filename, arcname=None, compress_type=None) # 將一個位元組串寫入歸檔檔案;zinfo_or_arcname可以是歸檔檔案中的檔名稱,也可以是一個ZipInfo例項 writestr(zinfo_or_arcname, bytes[, compress_type])
壓縮zip 新手通常會有一個不太好處理的問題 就是 新手很容易 把完整的路徑名寫入進去
我這裡是一個 指定資料夾下 部分檔案 壓縮以及解壓縮到指定目錄Demo
#!/usr/bin/env python #-*- coding: utf8 -*- import os import zipfile import shutil RECOVERY_SOMEFILES = [ "app", "app_adjust", "app_appsflyer" ] MODLE_ZIP_FNAME = "android_modle1.zip" IGNORE_FILENAMES = [".DS_Store", ".gitignore"] def buildModelZip(recovery_some=False): ... filelist = RECOVERY_SOMEFILES zipf = zipfile.ZipFile(dest_path, "w") try: for x in xrange(0,len(filelist)): tar_f = os.path.join(ROOT_PATH, filelist[x]) if os.path.isdir(tar_f): for tpath, folders, files in os.walk(tar_f): for filename in files: # 遍歷某一層級資料夾內所有檔案 if filename not in IGNORE_FILENAMES: new_path = tpath.replace(ROOT_PATH+os.path.sep, '') zipf.write(os.path.join(tpath, filename), os.path.join(new_path, filename)) # 向壓縮檔案內新增檔案 pass pass if os.path.isfile(tar_f): new_path = tar_f.replace(ROOT_PATH+os.path.sep, '') print(new_path) zipf.write(new_path, compress_type=zipfile.ZIP_DEFLATED) pass pass except Exception as e: print e raise finally: zipf.close() pass def extractFiles(recovery_some=False): ... filelist = RECOVERY_SOMEFILES zipf = zipfile.ZipFile(zip_path, "r") try: if recovery_some: namelist = zipf.namelist() for x in xrange(0,len(namelist)): for y in xrange(0,len(filelist)): if (namelist[x].startswith(filelist[y])): zipf.extract(member=namelist[x], path=dest_path) pass else: zipf.extractall(path=dest_path) except Exception as e: raise else: pass finally: zipf.close() pass if __name__ == "__main__": recovery_some = True buildModelZip(recovery_some) extractFiles(recovery_some) pass