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)
运行结果如下: