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/10073Desktop/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:WORKjs2.html"
zipName = r"E:WORKjs2.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到指定文件夹就行了。