首页 > 编程语言 >用python制作一个简单的zip压缩工具

用python制作一个简单的zip压缩工具

时间:2023-01-30 17:32:51浏览次数:43  
标签:压缩工具 zip python 压缩 压缩文件 window 文件夹 tk path


1. 功能设计

对文件或文件夹压缩,是日常工作中经常要做的事情,市面上也有非常多的压缩工具,在linux系统里,有zip, tar等命令可以用于压缩。最近学习了python的zipfile模块,它提供了通用的创建,读取,写入压缩文件的方法,使用方法非常简单,我尝试使用tkinter 写一个简单的压缩小工具。

界面这块,需要一个文件选择框,一个文件选择按钮,一个压缩按钮和一个label用于显示压缩过程中被压缩的文件。

功能方面,不提供对压缩文件命名的能力,只对文件夹进行压缩,压缩后的文件保存在和被压缩文件夹同级的目录中,压缩文件的名称为:文件夹名称.zip。

就这样,开干。

2. 程序设计

2.1 界面设计

import zipfile
import tkinter as tk
from tkinter import filedialog
from pathlib import Path

window = tk.Tk()
window.title('文件对话框') # 设置窗口的标题
window.geometry('800x100') # 设置窗口的大小

# 输入框
path_var = tk.StringVar()
entry = tk.Entry(window, textvariable=path_var, width=95)
entry.place(x=10, y=10, anchor='nw')

# 压缩明细
compress_var = tk.StringVar()
label = tk.Label(window, textvariable=compress_var, width=100, height=2, anchor='nw')
label.place(x=10, y=30) # 将标签固定在窗口上

tk.Button(window, text='选择').place(x=700, y=10, anchor='nw')
tk.Button(window, text='压缩').place(x=750, y=10, anchor='nw')

window.mainloop()

运行程序,界面效果如下

用python制作一个简单的zip压缩工具_相对路径

2.2 选择文件夹

点击选择按钮时,弹出文件选择对话框,我需要为选择按钮绑定一个函数

def click():
file_name= filedialog.askdirectory(title='选择一个文件夹',
initialdir='./' # 打开当前程序工作目录
)
path_var.set(file_name)

tk.Button(window, text='选择', command=click).place(x=700, y=10, anchor='nw')

选择好文件夹后,文件夹目录会在entry中显示。

2.4 压缩

def compress():
select_path = path_var.get() # 获取路径
select_path = Path(select_path)
zip_name = select_path.name + ".zip" # 最终的压缩文件路径
zip_path = select_path.parent.joinpath(zip_name)

with zipfile.ZipFile(str(zip_path), 'w')as f: # 进行压缩
files = select_path.glob("**/*") # 遍历被压缩文件的所有目录和文件
for filename in files:
compress_path = filename.relative_to(select_path) # 这里要获得被压缩文件的相对路径
compress_var.set(str(filename)) # 显示被压缩文件
label.update() # 更新label
f.write(str(filename), arcname=compress_path) # 压缩写入

compress_var.set('完成压缩')
label.update()

tk.Button(window, text='压缩', command=compress).place(x=750, y=10, anchor='nw')

压缩的过程很简单,使用zipfile.ZipFile创建压缩文件,然后将想要压缩的文件写入即可。这里容易产生一个误区,假设你想压缩demo文件夹,你以为f.write(’/demo’) 就可以将demo文件夹压缩好,这是错误的,压缩后的文件夹里,只有一个空的demo文件夹。write方法,如果传入的是文件,则压缩文件,如果传入的是文件夹,它不会默认压缩这个文件夹里的内容,只是会在压缩文件里为你创建这个文件夹而已。

因此,你想压缩某个文件,必须自己去遍历它,把demo目录下的所有文件夹和文件都使用write方法压缩写入才行。使用write方法时,第一个参数是你想要压缩的文件的目录,可以是相对路径,也可以是绝对路径,我这里用的是绝对路径,不能用相对路径,因为相对路径是相对我程序的启动目录而言的,这个路径难以计算。arcname是压缩包里的路径,这里必须用相对路径,是相对于被压缩文件的路径,比如demo目录下有一个1.txt文件,那么写入这个文件时,就应该这样写

f.write("d:/test/demo/1.txt", arcname='1.txt')

对文件的操作,我使用了pathlib模块的Path, 它是最新的文件系统处理模块,意在替换老旧的os.path等模块。


标签:压缩工具,zip,python,压缩,压缩文件,window,文件夹,tk,path
From: https://blog.51cto.com/u_15948370/6027509

相关文章

  • 掌握hashtable,深度理解python字典的数据结构
    文章目录​​1.hash函数​​​​2.hashtable​​​​2.1链地址法实现hashtable​​​​2.2解决冲突​​​​2.3开放寻址法实现hashtable​​​​2.4逻辑删除key​​​......
  • 忘掉python的os.path吧,pathlib巨好用
    1.pathlib取代os.path模块从python3.4开始,pathlib正式成为标准库,旨在取代老旧的os.path模块和一些os模块中对系统路径的操作。pathlib提供了表示文件系统路径的类,而os.pat......
  • python web框架多进程部署下数据库连接问题
    python常用的web框架,诸如flask,django,在生产部署时,都会选择多进程的部署方式,选用的中间件多为uwsgi或者gunicorn。如果项目里使用了数据库,那么就要考虑数据库连接在多进程下......
  • python使用正则表达式实现字符串替换
    python的字符串提供了replace方法,可以将子串替换成其他字符串,例如下面的代码name='flask_script'name=name.replace('_','-')print(name)#flask-script替换的前提......
  • C++子线程中调用python代码
    项目需要C++调用python的算法,由于python算法比较耗时,因此采用在C++里启动workingthread来调用python脚本,python代码里含有cv2.imread()等opencv的调用,在子线程里调用会卡......
  • 【Python笔记2.1】Python Unicode字符编解码
    以下部分参考[1],这里复制了其中一部分是为了防止原文被移动或删除。概述Python中有字符串类型(str)和字节类型(byte),以及Python编码中最常见也是最顽固的两个错误:Unic......
  • 【Python笔记2.2】用zipfile解压zip包时遇到的Unicode字符编解码问题
    pythonunicode字符编解码问题参见【Python笔记2.1】python中用zipfile解压zip包网上资料一堆,这里就不多说了。下面使用【Python笔记2.1】中总结出来的字符编解码函数......
  • 【KAWAKO】python查看内存空间占用情况
    目录查看变量的内存占用查看运行内存占用查看变量的内存占用importsysc=1145.114print(sys.getsizeof(c))查看运行内存占用importpsutilmemory=psutil.vir......
  • python实用小技之数据结构
     本文大多数例子搬自pythoncookbook这里是对学习的一个总结和提炼ps:python版本为python3 1.解压序列赋值给多个变量#有一个包含N个元素的元组或者是序列,怎样将......
  • python 中异常类型总结
    异常类型:异常名称描述BaseException       所有异常的基类SystemExit          解释器请求退出KeyboardInterrupt    用户中断......