python 使用7z进行二次压缩

#代码功能
将文件/文件夹进行二次打包
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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值