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

 

posted @   lesten  阅读(174)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2019-04-15 LeetCode (Two Sum & Add Two nums)
点击右上角即可分享
微信分享提示