python中怎么压缩文件夹_python-对指定文件夹进行压缩

python-对指定文件夹进行压缩

目的

首先,我试验了一下【1】的效果:

import os

from zipfile import ZipFile

def backupZip(folder): #这个函数只做文件夹打包的动作,不判断压缩包是否存在

zipfile_name = os.path.basename(folder) + '.zip' #压缩包和文件夹同名

with ZipFile(zipfile_name, 'w') as zfile: #以写入模式创建压缩包

for foldername, subfolders, files in os.walk(folder): #遍历文件夹

print('Adding files in ' + foldername +'...')

zfile.write(foldername)

for i in files:

zfile.write(os.path.join(foldername,i))

print('Adding ' + i)

print('Done.')

def folder2zip(folder): #文件夹打包为zip的函数

zipfile_name = os.path.basename(folder) + '.zip'

if not os.path.exists(zipfile_name): #检查压缩包是否存在,如果已存在则询问是否继续

backupZip(folder)

else:

response = input("Zipfile exists. Coutinue?('q' for quit): ")

if response != 'q':

backupZip(folder)

但是当我使用绝对路径 folder2zip("C:/Users/10073\Desktop/knn") 测试效果时,其效果却是这样的:

直接双击打开 knn.zip 结果却是这样的,而我想要的是打开zip文件出现的直接是该文件的内容。那么就需要改写代码了。

首先我们得了解ZipFile.write函数的用法。

ZipFile.write()的简单介绍

ZipFile.write(filename[, arcname[, compress_type]])

其中:filename为文件路径,arcname为添加到zip文档之后保存的名称,参数compress_type表示压缩方法,它的值可以是zipfile.ZIP_STORED或zipfile.ZIP_DEFLATED

示例代码:

import zipfile,os

fileName = r"E:\\WORK\\js\\2.html"

zipName = r"E:\\WORK\\js\\2.zip"

zf = zipfile.ZipFile(zipName, 'w')

zf.write(fileName,'3.html')#fileName-文件名,3.html-压缩后的文件名称

zf.close()

要想达到我的目的,需要一些递归操作。

思路与代码编写

首先,由于要进行递归写入,所以我把生成zipfile实例这一步放到了解压函数外面,并把它作为了解压函数的参数。(注意我的第5行和第10行)

def folder2zip(folder): #文件夹打包为zip的函数

zipfile_name = os.path.basename(folder) + '.zip'

if not os.path.exists(zipfile_name): #检查压缩包是否存在,如果已存在则询问是否继续

zfile=ZipFile(zipfile_name,'w')

myOwnZip(zfile,folder)

else:

response = input("Zipfile exists. Coutinue?('q' for quit): ")

if response != 'q':

zfile = ZipFile(zipfile_name, 'w')

myOwnZip(zfile,folder)

一开始我的 myOwnZip 函数是这样实现的:

def myOwnZip(zfile,folder):

print("folder:",folder)

fileList=os.listdir(folder)

for file in fileList:

if os.path.isfile(os.path.join(folder,file)): # 如果是文件

zfile.write(os.path.join(folder,file),file)

else:

zfile.write(os.path.join(folder,file),baseDir+"/"+file) # 创建文件夹

print("将文件夹",file,"添加到压缩包中")

myOwnZip(zfile,os.path.join(folder,file),file)

print('Done.')

但是这样会出现一个问题,就是不管是在第几层的文件都写在了同一级下(没能递归)。

也就是说如果一个文件存放在knn/test/mm.py,那么在zfile.write中的file也应该是knn/test/mm.py。但是在我们上述函数中,file输出为mm.py,所以zfile.write就直接把它放在第一层里了。

于是我又加了一个参数,basedir。

def myOwnZip(zfile,folder,baseDir=""):

print("folder:",folder)

print("baseDir:",baseDir)

fileList=os.listdir(folder)

for file in fileList:

if os.path.isfile(os.path.join(folder,file)): # 如果是文件

zfile.write(os.path.join(folder,file),os.path.join(baseDir,file))

else:

zfile.write(os.path.join(folder,file),baseDir+"/"+file) # 创建文件夹

print(baseDir+"/"+file)

print("将文件夹",file,"添加到压缩包中")

# baseFolderName=os.path.basename(folder)

myOwnZip(zfile,os.path.join(folder,file),baseDir=os.path.join(baseDir,file))

print('Done.')

这样就实现了递归压缩。

再接下来是,就是要实现把文件压缩到指定文件夹。这个思路就很简单了,我们把它压缩到当前目录后,再shutil.move到指定文件夹就行了。专业代写,扫码了解

参考资料

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值