1. 程式人生 > 其它 >python zipfile 模組基礎使用及demo

python zipfile 模組基礎使用及demo

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