使用python压缩文件夹和os.path模块的部分说明

zipf = zipfile.ZipFile(output_filename, mode='w')  创建一个可读的zip文件,
mode:Open the ZIP file with mode read 'r', write 'w', exclusive create 'x',
or append 'a'.
output_filename:需要保存到的位置和名字,例如1月通信费.zip则保存在代码文件目录,例如C:/Users/jupy/Documents/myself/1月通信费.zip则保存在该绝对路径下面。


zipf.write(filename, arcname=None,compress_type=None, compresslevel=None)

filename:要压缩文件的相对路径或者绝对路径

arcname: 是归档文件中的名称(默认情况下,该名称与文件名相同,但没有驱动器号,并且删除了前导路径分隔符)

(1)arcname并未指定归档文件名字,filename为绝对路径

zipf.write(pathfile),其中pathfile是绝对路径,比如其中一个文件的路径为'C:/Users/jupy/Documents/myself/1月通信费\\通信报销明细表(1月).xlsx'

那么输出:压缩文件的目录是从Users-jupy-Documents-myself-1月通信费-目标文件目录

 实际上我们只需要目标文件目录,即上面的紫色方框内容。

(2)arcname并未指定归档文件名字,filename为相对路径

这时候,我们将要压缩的文件夹,放在当前代码目录下

zipf.write(pathfile),其中pathfile是相对,比如其中一个文件的路径为'1月通信费\\通信报销明细表(1月).xlsx'

那么输出:压缩文件的目录是从1月通信费-目标文件目录

 (3)arcname指定归档文件名字,filename为绝对路径

zipf.write(pathfile, arcname),其中pathfile是其中一个文件的绝对路径,arcname是该文件的归档文件名字。例如pathfile='C:/Users/jupy/Documents/myself/1月通信费\\通信报销明细表(1月).xlsx'   arcname='通信报销明细表(1月).xlsx'

那么输出:压缩文件的目录直接是目标文件目录,意味着arcname指定之后,压缩文件的目录会以arcname为主。

 注意:

(1)创建了zip文件,最后记得要关闭该文件zipf.close(),或者使用with语句自动关闭。

(2)如果保存的目录中存在相同的压缩文件,那么自动会将其删除替换。

完整代码演示:

python中os.path常用模块

os.path.sep:路径分隔符,和系统不一样。windows下面是‘\\’,第一个是转义符,转义符不打印。 linux下面是’/’。

os.path.altsep: 根目录,和系统不一样。windows是‘/’,linux下面是‘’空的。

os.path.curdir:当前目录,都一样是‘.’

os.path.pardir:父目录,都一样是‘..’

os.path.abspath(path):绝对路径

获取当前目录:os.path.abspath('.')=os.path.abspath(os.curdir)=os.getcwd()

os.path.join(path1,path2): 常用来链接路径,使用当前系统下的路径分隔符来进行连接两个路径

os.path.split(path): 把path分为目录和文件两个部分,以tuple返回,等于(os.path.dirname(path), os.path.basename(path))

os.path.isabs(path):判断路径是否为绝对路径

os.path.exists(path):判断路径是否存在

os.path.isfile(path):判断路径是否为文件

os.path.isdir(path):判断路径是否为文件夹

os.path.islink(path):判断路径是否为链接

import os
import zipfile

def make_zip(source_dir):  # 将文件夹打包             
    output_filename = source_dir + '.zip'  # 压缩包和文件夹同名同路径
    # 使用with方式,则会自动关闭zip文件,如果不使用with,而是直接创建,即zipf=zipfile.ZipFile(output_filename, 'w'),那么在最后需要使用zipf.close()
    with zipfile.ZipFile(output_filename, 'w') as zipf:  # 以写入模式创建压缩包
        for root, dirs, files in os.walk(source_dir):   # 遍历文件夹,返回三个:root,dirs,files.
            print('正在压缩文件夹' + root+'...')
            for filename in files:
                pathfile = os.path.join(root, filename)
                arcname = pathfile[len(source_dir):].strip(os.path.sep)  # 不能使用arcname = filename,因为通讯费pdf文件是放在汇总文件夹下面的,所以压缩的时候要带着文件夹一起
                zipf.write(pathfile,arcname)
                print('正在添加文件 ' + filename)
    print('压缩完成!')


def folder2zip(source_dir):  # 文件夹打包为zip的函数
    zipfile_name = source_dir + '.zip'                    
    if not os.path.exists(zipfile_name):  # 检查压缩包是否存在,如果不存在则直接打包
        make_zip(source_dir)
    else:  # 如果存在则询问是否继续
        response = input("Zipfile exists. Coutinue?('q' for quit): ")
        if response != 'q':
            make_zip(source_dir)

dirname = "C:/Users/jupy/Documents/myself/1月通信费"
folder2zip(dirname)

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值