#代码功能
将文件/文件夹进行二次打包
1.可选择是否添加密码
2.可选择统一打包成一个压缩包或将多个文件逐一打包成独立的压缩包
3.一次压缩和二次压缩的文件均会保留
import windnd,time,sys,os
import tkinter as tk
from tkinter import ttk
import subprocess
from multiprocessing.dummy import Pool
#获取根目录地址
if hasattr(sys, '_MEIPASS'):
baseDirPath = os.path.dirname(os.path.realpath(sys.executable))
else:
baseDirPath = sys.path[0]
print(baseDirPath)
ZipDir = os.path.join(baseDirPath, 'ZipFile')
if not os.path.exists(ZipDir):
os.makedirs(ZipDir)
def get_ymdhms(): #获取当前时间信息,作为压缩包的命名
return time.strftime('%Y%m%d%H%M%S', time.localtime())
def txtWriter(txt_path, wd_info): #写入txt记录压缩信息
f = open(txt_path, 'a+')
f.write(wd_info)
f.close()
#输出压缩命令字符串,fuc_zip_opt操作时直接调用字符串即可运行
def zip_sig_cmd(src_dir, dst_path, fpwd):
sz = baseDirPath + '\\7-Zip\\7z.exe'
cmd = ''
if fpwd == '':
cmd ='"' + sz + '" a -tzip "' + dst_path + '" "' + src_dir + '" -mmt=on'
else: #-mmt=on 开启多线程
cmd ='"' + sz + '" a -tzip "' + dst_path + '" -p' + fpwd + ' "' + src_dir + '" -mmt=on'
return cmd
def fuc_zip_opt(cmd):
print(cmd)
if cmd != '':
try:
f = subprocess.Popen(cmd)
f.wait() #等待命令执行完
except Exception as e:
print('fuc_zip_opt is error',e)
if __name__ == '__main__':
root = tk.Tk()
root.geometry('1080x340+300+200') #生成操作界面
################################################
db_zip_path_var = tk.StringVar()
db_zip_path_var.set('D:\\')
#附加添加的字段
suf_var = tk.StringVar()
suf_var.set('删除文字')
#密码文本框
pwd_var = tk.StringVar()
pwd_var.set('')
#统一打包还是逐一打包
obyo = tk.IntVar()
obyo.set(1)
#是否要密码
zip_has_pwd = tk.IntVar()
zip_has_pwd.set(1)
#获取待打包的文件名,该函数用于实现文件直接拖入功能
def dragged_files(files):
msg = '\n'.join((item.decode('gbk') for item in files))
db_zip_path_var.set(msg)
#打包代码
def bt_db_zip_func():
db_path = db_zip_path_var.get()
db_suf = suf_var.get()
db_zip_type = obyo.get()
db_has_pwd = zip_has_pwd.get()
db_pwd_str = pwd_var.get()
zip_sig_files = []
zip_sig_cmd_lists = []
if db_has_pwd: #有密码
if len(db_pwd_str.replace(' ', '')) > 0:
zip_password = db_pwd_str
else:
print('密码不能为空!!!')
else: #无密码
zip_password = ''
now_time = get_ymdhms()
zip_sig_dir1 = os.path.join(ZipDir, now_time, 'First')
if not os.path.exists(zip_sig_dir1):
os.makedirs(zip_sig_dir1)
#txt
zip_info_txt = os.path.join(ZipDir, now_time,f'First.txt')
ss = 'mima:' + zip_password + '\n'
txtWriter(zip_info_txt, ss)
#zip_sig_files list补充路径
if os.path.isfile(db_path):
zip_sig_files += [db_path]
elif os.path.isdir(db_path):
if db_zip_type:
zip_src_files = os.listdir(db_path)
for pt in zip_src_files:
zip_sig_files += [os.path.join(db_path, pt)]
else:
zip_sig_files += [db_path]
print(zip_sig_files)
zip_num_i = 0
for zip_sig in zip_sig_files:
zsrc_path = zip_sig
zdst_path = os.path.join(zip_sig_dir1, f'{now_time}-{str(zip_num_i).zfill(5)}.zip')
ss = os.path.basename(zdst_path) + ',' + zsrc_path + ',\n'
txtWriter(zip_info_txt, ss)
zip_sig_cmd_lists += [zip_sig_cmd(zsrc_path, zdst_path, zip_password)]
zip_num_i += 1
pool = Pool(2)
pool.map(fuc_zip_opt ,zip_sig_cmd_lists)
print('---已SIG压缩完-----', zip_sig_dir1)
zip_sig_cmd_lists = []
print('-----开始二次压缩-----')
zip_sd_dir = os.path.join(ZipDir, now_time, 'Second') #########二次目录
if not os.path.exists(zip_sd_dir):
os.makedirs(zip_sd_dir)
zip_first_files = os.listdir(zip_sig_dir1)
for zft in zip_first_files:
if os.path.isfile(os.path.join(zip_sig_dir1, zft)):
zft_rename = os.path.join(zip_sig_dir1, zft+ db_suf)
os.rename(os.path.join(zip_sig_dir1, zft), zft_rename)
zsrc_path = zft_rename
zdst_path = os.path.join(zip_sd_dir, 'sd' + zft)
zip_sig_cmd_lists += [zip_sig_cmd(zsrc_path, zdst_path, zip_password)]
pool = Pool(2)
pool.map(fuc_zip_opt ,zip_sig_cmd_lists)
print('---已二次压缩完-----', zip_sd_dir)
zip_second_files = os.listdir(zip_sd_dir)
for zft in zip_second_files:
zft_rename = os.path.join(zip_sd_dir, zft+ db_suf)
os.rename(os.path.join(zip_sd_dir, zft), zft_rename)
#界面布局
db_zip_fm = tk.LabelFrame(root, text='Double Zip', padx= 10, pady = 2)
db_zip_fm.pack(fill = 'x')
tk.Label(db_zip_fm, text='文件地址', padx= 10, pady = 2).pack(side='left')
db_zip_path = tk.Entry(db_zip_fm, width = 40, textvariable=db_zip_path_var)
db_zip_path.pack(side='left', padx = 5,pady = 2)
#################
windnd.hook_dropfiles(db_zip_path , func=dragged_files)
tk.Label(db_zip_fm, text='后缀名', padx= 10, pady = 2).pack(side='left')
tk.Entry(db_zip_fm, width = 12, textvariable=suf_var).pack(side='left', padx = 5, pady = 2)
ttk.Radiobutton(db_zip_fm, text="统一打包", variable=obyo, value = 0).pack(side='left',padx=5)
ttk.Radiobutton(db_zip_fm, text="逐一打包", variable=obyo, value=1).pack(side='left', padx=5)
check2 = ttk.Checkbutton(db_zip_fm, variable=zip_has_pwd, text="密码")
check2.pack(side='left', padx=5)
tk.Entry(db_zip_fm, width = 20, textvariable=pwd_var).pack(side='left', padx = 5, pady = 2)
bt_db_zip = tk.Button(db_zip_fm, text='二次压缩', width = 15, command = bt_db_zip_func)
bt_db_zip.pack(side='left', padx = 5, pady = 2)
root.mainloop()
代码参考:https://download.csdn.net/download/mjc1321/89064799