python截屏保存到指定文件夹_python-对指定文件夹进行压缩

9141331899cb2434e2e8c40ed6a861ca.png

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") 测试效果时,其效果却是这样的:

8353045f1a70a713db443f94ffff966f.png


直接双击打开 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到指定文件夹就行了。

3732f4cab6b48e64db11e6167c1d83df.png
专业代写,扫码了解

参考资料

【1】CSDN博客——如何用ZipFile.write()压缩打包文件夹
【2】博客园-zipfile.write参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值