python 多级目录压缩解压文件

本文介绍了一个支持跨平台、中文路径、多级目录的文件压缩与解压工具,支持压缩时不带父文件夹目录、指定压缩包名称、指定路径等功能。提供了详细的代码实现和使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

咱向来就是拿来主意,也发个东西供同行“拿来”使用吧

咱信奉的就是少量的代码完成大量的工作,虽然代码不多,但还是要用大脑的。发出来供大家参考

功能:

  • 支持中文路径,支持多级目录
  • 支持跨平台,在linux和window下都可直接使用
  • 压缩的多态性
    • 压缩包不带级父文件夹目录压缩
    • 压缩包带父级文件夹目录
    • 不指定目标文件与路径压缩
    • 指定压缩包名称不指定路径压缩

还是看代码吧

#coding:utf-8
#压缩解压文件模块
#支持中文路径,支持多级目录
#支持跨平台,在linux和window下都可直接使用
#python 2.7.2
#author:xieShuxu
#QQ:258356793
#Email:sondx@qq.com
import zipfile,os

class ZipException(Exception):
	pass

def unZipFile(zipPath,unZipPath=''):
	'''解压文件

	zipPath 要解压的文件路径
	unZipPath 解压目标路径 默认解压到zipPath所在目录
	'''
	try:
		filePath=filePath.decode('utf-8');
		zipFilePath=zipFilePath.decode('utf-8');
	except:
		print '================'
	if not os.path.exists(zipPath):
		raise ZipException,'function unZipFile:not exists file or dir(%s)' %zipPath;



	if unZipPath=='':
		unZipPath=os.path.splitext(zipPath)[0];

	if not unZipPath.endswith(os.sep):
		unZipPath+=os.sep;

	z = zipfile.ZipFile(zipPath, 'r')
	#zipInfolist=z.namelist();
	for k in z.infolist():
		savePath=unZipPath+k.filename;
		saveDir=os.path.dirname(savePath);
		if not os.path.exists(saveDir):
			os.makedirs(saveDir);

		f=open(savePath,'wb');
		f.write(z.read(k));
		f.close();
	z.close();

	#print unZipPath


global _iterateExeZipFile;
def exeZipFile(filePath,zipFilePath=''):
	'''压缩文件

	filePath 要解压的文件路径 可以是文件或者目录
			 os.sep结尾表示压缩该目录下的子文件和文件夹 不包含该文件夹,否则包含该文件夹压缩
	ZipFilePath 压缩包文件路径
				也可只传文件名
				默认压缩到filePath的父级目录下
	'''
	filePath=filePath.decode('utf-8');
	zipFilePath=zipFilePath.decode('utf-8');
	#压缩文件不存在直接返回
	if not os.path.exists(filePath):
		raise ZipException,'function exeZipFile:not exists file or dir(%s)' %filePath;

	# 是否包含父级目录压缩
	hasPDir=not filePath.endswith(os.sep);
	if not hasPDir:
		filePath=os.path.dirname(filePath);
		print filePath

	#校验备份文件路径
	if zipFilePath=='':
		zipFilePath=os.path.splitext(filePath)[0]+'.zip';
	elif zipFilePath.find(os.sep)==-1:#只传文件名的处理
		zipFilePath=os.path.dirname(filePath)+os.sep+zipFilePath;

	#校验创建备份路径目录
	if not os.path.exists(os.path.dirname(zipFilePath)):
		os.makedirs(os.path.dirname(zipFilePath));

	#初始化压缩包中的根目录
	zipRoot='';
	if hasPDir:
		zipRoot=os.path.split(filePath)[1];

	#开始压缩
	z = zipfile.ZipFile(zipFilePath, 'w')
	if os.path.isfile(filePath):
		z.write(filePath,os.path.split(filePath)[1]);
	else:
		_iterateExeZipFile(filePath,zipRoot,z);
	z.close();


def _iterateExeZipFile(dirPath,zipRoot,z):

压缩使用的例子:

if __name__=='__main__':
	#压缩包不带级父文件夹目录
	testdir='D:\\codeSource\\linuxAgent\\'
	zipFilePath='D:\\codeSource\\压缩包不带父级目录.zip'
	exeZipFile(testdir,zipFilePath);

	#压缩包带父级文件夹目录
	testdir='D:\\codeSource\\linuxAgent'#不带后缀斜线
	zipFilePath='D:\\codeSource\\压缩包带父级目录.zip'
	exeZipFile(testdir,zipFilePath);


	#不指定目标文件与路径压缩
	testdir='D:\\codeSource\\linuxAgent'
	exeZipFile(testdir);

	#指定压缩包名称不指定路径压缩
	testdir='D:\\codeSource\\linuxAgent\\'
	exeZipFile(testdir,'仅指定名称压缩包.zip');

解压的例子:

	#指定解压目录解压文件
	testdir=u'D:\\codeSource\\仅指定名称压缩包\\'
	zipFilePath=u'D:\\codeSource\\仅指定名称压缩包.zip'
	unZipFile(zipFilePath,testdir);
	
	#不指定目录解压
	zipFilePath=u'D:\\codeSource\\仅指定名称压缩包.zip'
	unZipFile(zipFilePath);

好了!就这么多,如果你觉得有用就顶一下吧。有问题也可以联系我


<think>嗯,用户遇到了Keil5编译时的警告问题,具体是关于IRQ_Init函数的#1295-D警告。我需要先理解这个警告的原因。根据之前的引用内容,像这样的警告通常是因为函数声明时没有明确参数类型。比如,用户可能声明了IRQ_Init()而没有参数类型,导致编译器认为这是过时的声明方式。 首先,我应该检查函数声明和定义的地方。用户可能在头文件里声明了IRQ_Init(),但没有指定参数。根据引用[2]和[3]的例子,正确的做法是在函数声明中加入void,即IRQ_Init(void)。这样编译器就知道该函数确实没有参数,而不是旧的K&R风格声明。 接下来,用户可能在源文件中定义了IRQ_Init函数,可能也没有参数列表。这时候同样需要修改定义部分,加上void。比如,原来的定义可能是void IRQ_Init() { ... },需要改为void IRQ_Init(void) { ... }。这样可以确保声明和定义一致,消除警告。 另外,用户可能没有检查所有调用该函数的地方,是否存在错误传递参数的情况。虽然这个函数没有参数,但如果有地方错误地传递了参数,可能会导致其他问题。不过根据警告信息,主要是声明的问题,所以先处理声明和定义应该足够。 总结步骤:修改头文件中的声明,添加void;修改源文件中的定义,添加void;确保调用正确。同时,参考之前的解决方案,比如引用[2]中的例子,直接应用即可解决问题。需要提醒用户注意代码中的其他类似函数,也可能存在同样的问题,一并检查修改。</think>### 解决Keil5中IRQ_Init函数的#1295-D警告问题 **问题分析** Keil5编译时出现`warning: #1295-D: Deprecated declaration IRQ_Init - give arg types`,这表明函数`IRQ_Init`的声明方式已过时。根本原因是**函数声明未明确指定参数类型**,导致编译器认为使用了旧式函数定义(K&R风格)[^2][^3]。 --- #### 解决步骤 1. **修改函数声明** 在头文件(如`irq.h`)中,将函数声明从`IRQ_Init()`改为明确指定参数类型为`void`: ```c // 原声明(触发警告) void IRQ_Init(); // 修改后(消除警告) void IRQ_Init(void); ``` 2. **修改函数定义** 在源文件(如`irq.c`)中,确保函数定义也包含`void`参数: ```c // 原定义(触发警告) void IRQ_Init() { // 函数体 } // 修改后(消除警告) void IRQ_Init(void) { // 函数体 } ``` 3. **检查所有调用处** 确认调用`IRQ_Init()`时未传递任何参数。例如: ```c int main(void) { IRQ_Init(); // 正确调用 // ... } ``` --- #### 原理说明 - C语言中,函数声明`void func()`表示参数类型未指定(旧式声明),而`void func(void)`明确表示无参数[^2]。 - Keil5的编译器(基于ARMCC)要求遵循C99/C11标准,旧式声明会触发兼容性警告---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值