python-自动化篇-办公-批量新建文件夹并保存日志信息

文章目录

  • 说明
  • 代码
  • 效果

说明

因为业务需要,每天都需要按当天的日期创建很多新文件夹。把这种重复又繁重的操作交给Python来做,一直是我的目标。先说下要求:

  1. 默认在桌面新建文件夹。
  2. 文件夹命名方式,“月.日-1”,比如7.8-1,7.8-2。7是代表当天的月份,不能显示07。8是代表当天的日期,不能显示08。-1,-2…是文件夹的序号。
  3. 序号支持手动输入,比方可以自己输入10就创建10个文件夹。要有记忆功能,这次输入10以后,下次运行程序就默认是10。

再说下思路及步骤:

  1. 使用Tkinter创建操作界面,需要有文件及路径文本框和选择按钮;文件夹数量输入框及执行新建按钮;显示操作执行过程的列表框。
  2. 获取当天的月份和日期。
  3. 按需求的数量创建新文件夹。
  4. 将最近输入的文件夹数量保存到log.txt文件,下次运行程序直接从log.txt取数,实现记忆功能。
    使用Tkinter创建界面。下面来看看如何获取当天的月份和日期,并整理成想要的格式。定义了一个函数get_current_date,然后将日期转换成本地时间,再分别获取月份和天数,并转为整数,这样“07”才能变成“7”。最后将月和天用“.”连起来,就得到了最终结果。比如今天,结果就显示为"7.9"。
#获取当天的月份和日期,整理成想要的格式
from time import time, localtime ,strftime
def get_current_date():time_stamp = time()  # 当前时间的时间戳local_time = localtime(time_stamp)  #转为本地时间str_time_month = int(strftime('%m', local_time))#获取月份并转为整数str_time_day = int(strftime('%d', local_time))#获取天数并转为整数return str(str_time_month)+"."+str(str_time_day)#整理格式
get_current_date()

然后写创建新文件夹的函数create_folders,其中传入两个参数,即以上处理好的日期date和文件夹数量qty。用for循环根据数量来创建。先将文件夹的名称字符串按需要连接好,存入变量folder。然后用if语句判断此目录是否存在,若不存在,才使用os.makedirs创建,若存在,则输出“目录已存在”的提示。调用函数实验了一下,没问题。

#创建新文件夹
import os
def create_folders(date,qty):for i in range(1,qty+1):folder = 'D:\\' + date + '-' + str(i)# 判断是否已经存在该目录if not os.path.exists(folder):# 目录不存在,进行创建操作os.makedirs(folder) #使用os.makedirs()方法创建多层目录print("目录新建成功:" + folder) else:print("目录已存在!")date = get_current_date()
qty = 3
create_folders(date,qty)

下面定义一个函数save_recent_folder_qty,用于将最近使用过的“文件夹数量”保存到日志文件log.txt。先设定好文件的路径及文件名,存入变量log_file,然后使用写入模式w打开文件,将数量qty写入。写好后,调用一下,就可以在指定的路径下看到这个文件了,打开可见里面的内容为“10”。

def save_recent_folder_qty(qty):'''保存最近的文件夹数量'''log_file = os.getcwd() + "\\log.txt"with open(log_file, "w") as f:recent_qty = str(qty)f.write(recent_qty) 
save_recent_folder_qty(10)

然后还需要从上面保存的日志文件中提取最近用过的“文件夹数量”,还是定义一个函数get_folder_qty,指定路径存入log_file变量。首次运行程序的时候,这个日志文件还没有的。所以为避免报错,先用if语句判断是否存在。若已存在,则直接读取到qty变量中,并返回;如不存在,则返回“0”。写好后,也可以调用一下,看看是否有问题。

def get_folder_qty():log_file = os.getcwd() + "\\log.txt"if os.path.exists(log_file):with open(log_file, "r") as f:qty = f.readline()return int(qty)else:return 0
a = get_folder_qty()
print(a)

以上准备工作做好后,就可以整合到类MainGUI中去了。这个整合,基本上跟实例63(https://zhuanlan.zhihu.com/p/151754669) 差不多,下面挑有差异的部分进行说明。首先,增加了两个标签self.label_1self.label_2,用于提示文本框中显示的内容,分别是“目标目录”和“文件件数量”。还有,就是给文本框增加了默认显示的内容。其中StringVar用于跟踪字符串变量,方便将其值显示在界面上。将要要显示的内容经StringVar处理,传给变量addr,然后赋给Entry中的textvariable参数,就可以在文本框显示了。同样,日志文件log.txt中读取最近使用过的文件夹数量也是这样显示在文本框。
最后,将函数跟界面的按钮,文本框,列表框连接起来,就可以开始运行了。

import os
from datetime import datetime
from time import time, localtime ,strftime
from tkinter import Tk,Entry,Button,Listbox,X,Y,END,Scrollbar,RIGHT,BOTTOM,HORIZONTAL,StringVar,Label
from tkinter.filedialog import askdirectoryclass MainGUI():def __init__(self):myWindow = Tk()myWindow.title("批量新建文件夹")#设置窗口大小myWindow.geometry('590x400')#增加标签self.label_1 = Label(myWindow, text=' 目标目录:')self.label_1.place(x=10, y=10,width=70, height=30)self.label_2 = Label(myWindow, text='文件夹数量:')self.label_2.place(x=10, y=50,width=70, height=30)#增加文本框addr = StringVar(value='C:\\Users\\xxxx\\Desktop') #文本框默认显示的内容self.input_entry = Entry(myWindow, highlightcolor='red', highlightthickness=1, textvariable=addr)self.input_entry.place(x=80, y=10,width=410, height=30)self.btn_in = Button(myWindow, text='选择目录',command = self.select_dir1, width=10, height=1) self.btn_in.place(x=500,y=10)folder_quantity = str(self.get_folder_qty()) #从日志文件`log.txt`中读取最近使用过的文件夹数量def_qty = StringVar(value = folder_quantity)self.folderQty_entry = Entry(myWindow, highlightcolor='blue', highlightthickness=1, textvariable=def_qty)self.folderQty_entry.place(x=80, y=50,width=410, height=30)self.btn_exe = Button(myWindow, text='执行新建',command = self.create_folders, width=10, height=1)self.btn_exe.place(x=500,y=50)#增加列表框self.result_show = Listbox(myWindow,bg='Azure') self.result_show.place(x=10,y=100, width=570, height=290)self.sbY = Scrollbar(self.result_show,command=self.result_show.yview)#在列表框中增加Y轴滚动条self.sbY.pack(side=RIGHT,fill=Y)self.result_show.config(yscrollcommand = self.sbY.set)self.sbX = Scrollbar(self.result_show,command=self.result_show.xview,orient = HORIZONTAL)#在列表框中增加X轴滚动条self.sbX.pack(side=BOTTOM,fill=X)self.result_show.config(xscrollcommand = self.sbX.set)myWindow.mainloop()def select_dir1(self):self.input_entry.delete(0, END)self.input_entry.insert(0, askdirectory(initialdir= "D:\\"))def create_folders(self):date = self.get_current_date() #获取日期qty = int(self.folderQty_entry.get()) #获取文本框中文件夹数量,并转为整数for i in range(1,qty+1):folder = self.input_entry.get() + "\\" + date + '-' + str(i)# 判断是否已经存在该目录if not os.path.exists(folder):# 目录不存在,进行创建操作os.makedirs(folder) #使用os.makedirs()方法创建目录f = f"目录新建成功:{folder}" # 创建一个显示项self.result_show.insert("end", f) #将结果添加到列表框中else:f = f"目录已存在:{folder}" # 创建一个显示项self.result_show.insert("end", f) #将结果添加到列表框中f = "-"*100 #创建分割线self.result_show.insert("end", f) # 将分割线添加到列表框f = f"程序运行完成,请关闭窗口退出."# 创建一个显示项self.result_show.insert("end", f) # 将结果添加到列表框f = " "*100self.result_show.insert("end", f) # 将以上空格添加到列表框self.save_recent_folder_qty() #保存最新的文件夹数量def get_current_date(self):time_stamp = time()  local_time = localtime(time_stamp)  str_time_month = int(strftime('%m', local_time))str_time_day = int(strftime('%d', local_time))return str(str_time_month)+"."+str(str_time_day)def get_folder_qty(self):'''从log.txt文件中获取最近的文件夹数量,若没有则返回0'''log_file = os.getcwd() + "\\log.txt"if os.path.exists(log_file):with open(log_file, "r") as f:qty = f.readline()return int(qty)else:return 0def save_recent_folder_qty(self):'''保存最近的文件夹数量'''log_file = os.getcwd() + "\\log.txt"with open(log_file, "w") as f:recent_qty = str(self.folderQty_entry.get())f.write(recent_qty) if __name__ == "__main__":MainGUI()

首次运行,弹出窗口如下。可见“目标目录”是我们设定好的默认显示值。因为第一次运行,还没有日志文件log.txt,所以“文件夹数量”是我们设定好的默认值“0”。
在这里插入图片描述

选择好“目标目录”,并设定好“文件夹数量”后,点击“执行新建”,需要的文件夹秒秒钟建好。日志文件也将输入的“文件夹数量”自动保存下来了。
在这里插入图片描述

代码

import os
from datetime import datetime
from time import time, localtime ,strftime
from tkinter import Tk,Entry,Button,Listbox,X,Y,END,Scrollbar,RIGHT,BOTTOM,HORIZONTAL,StringVar,Label
from tkinter.filedialog import askdirectoryclass MainGUI():def __init__(self):myWindow = Tk()myWindow.title("批量新建文件夹")#设置窗口大小myWindow.geometry('590x400')#增加标签self.label_1 = Label(myWindow, text=' 目标目录:')self.label_1.place(x=10, y=10,width=70, height=30)self.label_2 = Label(myWindow, text='文件夹数量:')self.label_2.place(x=10, y=50,width=70, height=30)#增加文本框addr = StringVar(value='C:\\Users\\xxxx\\Desktop') #文本框默认显示的内容self.input_entry = Entry(myWindow, highlightcolor='red', highlightthickness=1, textvariable=addr)self.input_entry.place(x=80, y=10,width=410, height=30)self.btn_in = Button(myWindow, text='选择目录',command = self.select_dir1, width=10, height=1) self.btn_in.place(x=500,y=10)folder_quantity = str(self.get_folder_qty()) #从日志文件`log.txt`中读取最近使用过的文件夹数量def_qty = StringVar(value = folder_quantity)self.folderQty_entry = Entry(myWindow, highlightcolor='blue', highlightthickness=1, textvariable=def_qty)self.folderQty_entry.place(x=80, y=50,width=410, height=30)self.btn_exe = Button(myWindow, text='执行新建',command = self.create_folders, width=10, height=1)self.btn_exe.place(x=500,y=50)#增加列表框self.result_show = Listbox(myWindow,bg='Azure') self.result_show.place(x=10,y=100, width=570, height=290)self.sbY = Scrollbar(self.result_show,command=self.result_show.yview)#在列表框中增加Y轴滚动条self.sbY.pack(side=RIGHT,fill=Y)self.result_show.config(yscrollcommand = self.sbY.set)self.sbX = Scrollbar(self.result_show,command=self.result_show.xview,orient = HORIZONTAL)#在列表框中增加X轴滚动条self.sbX.pack(side=BOTTOM,fill=X)self.result_show.config(xscrollcommand = self.sbX.set)myWindow.mainloop()def select_dir1(self):self.input_entry.delete(0, END)self.input_entry.insert(0, askdirectory(initialdir= "D:\\"))def create_folders(self):date = self.get_current_date() #获取日期qty = int(self.folderQty_entry.get()) #获取文本框中文件夹数量,并转为整数for i in range(1,qty+1):folder = self.input_entry.get() + "\\" + date + '-' + str(i)# 判断是否已经存在该目录if not os.path.exists(folder):# 目录不存在,进行创建操作os.makedirs(folder) #使用os.makedirs()方法创建目录f = f"目录新建成功:{folder}" # 创建一个显示项self.result_show.insert("end", f) #将结果添加到列表框中else:f = f"目录已存在:{folder}" # 创建一个显示项self.result_show.insert("end", f) #将结果添加到列表框中f = "-"*100 #创建分割线self.result_show.insert("end", f) # 将分割线添加到列表框f = f"程序运行完成,请关闭窗口退出."# 创建一个显示项self.result_show.insert("end", f) # 将结果添加到列表框f = " "*100self.result_show.insert("end", f) # 将以上空格添加到列表框self.save_recent_folder_qty() #保存最新的文件夹数量def get_current_date(self):time_stamp = time()  local_time = localtime(time_stamp)  str_time_month = int(strftime('%m', local_time))str_time_day = int(strftime('%d', local_time))return str(str_time_month)+"."+str(str_time_day)def get_folder_qty(self):'''从log.txt文件中获取最近的文件夹数量,若没有则返回0'''log_file = os.getcwd() + "\\log.txt"if os.path.exists(log_file):with open(log_file, "r") as f:qty = f.readline()return int(qty)else:return 0def save_recent_folder_qty(self):'''保存最近的文件夹数量'''log_file = os.getcwd() + "\\log.txt"with open(log_file, "w") as f:recent_qty = str(self.folderQty_entry.get())f.write(recent_qty) if __name__ == "__main__":MainGUI()

效果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/467647.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国计算机等级考试二级,Web考试大纲(2023年版)

基本要求 1.理解Web基本工作原理,掌握Web技术的基本概念和基础。 2.理解超文本传输协议 HTTP的基本概念和模型,掌握 HTTP的消息格式、常用消息头、请求消息和常用请求方法、响应消息和常用响应状态。 3.熟练掌握超文本标记语言 HTMl文档的结构、常用文档…

JavaWeb:SpingBoot原理 --黑马笔记

1. 配置优先级 在我们前面的课程当中,我们已经讲解了SpringBoot项目当中支持的三类配置文件: application.properties application.yml application.yaml 在SpringBoot项目当中,我们要想配置一个属性,可以通过这三种方式当中…

C++ 贪心 Huffman树 合并果子

在一个果园里,达达已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。 达达决定把所有的果子合成一堆。 每一次合并,达达可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和。 可以看出,所有…

spring boot整合cache使用Ehcache 进行数据缓存

之前的文章 spring boot整合 cache 以redis服务 处理数据缓存 便捷开发 带着大家通过spring boot整合了 cache 缓存 那么 我们就来说说 其他服务的缓存 而spring boot默认的缓存方案就是 cache 用simple模式 spring boot的强大在于它的整合能力 它将其他缓存技术整合 统一了接…

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示

【北邮鲁鹏老师计算机视觉课程笔记】08 texture 纹理表示 1 纹理 规则和不规则的 2 纹理的用处 从纹理中恢复形状 3 分割与合成 4 分析纹理进行分类 通过识别纹理分析物理性质 如何区分纹理 5 寻找有效的纹理分类方法 发现模式、描述区域内模式 A对应图2 B对应图…

LeetCode、1318. 或运算的最小翻转次数【中等,位运算】

文章目录 前言LeetCode、1318. 或运算的最小翻转次数【中等,位运算】题目链接与分类题解位运算 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领…

如何在Spring Boot中启用HTTPS?

在Spring Boot中启用HTTPS是一个增强应用程序安全性的重要步骤。下面我将介绍如何将一个Spring Boot项目配置成支持HTTPS协议。 引入 在现代的网络通信中,安全性成为了一个不能忽视的要求。特别是当我们谈论到数据传输时,保护用户信息的安全性是非常重要…

CSS之水平垂直居中

如何实现一个div的水平垂直居中 <div class"content-wrapper"><div class"content">content</div></div>flex布局 .content-wrapper {width: 400px;height: 400px;background-color: lightskyblue;display: flex;justify-content:…

四、案例 - Oracle数据迁移至MySQL

Oracle数据迁移至MySQL 一、生成测试数据表和数据1.在Oracle创建数据表和数据2.在MySQL创建数据表 二、生成模板文件1.模板文件内容2.模板文件参数详解2.1 全局设置2.2 数据读取&#xff08;Reader&#xff09;2.3 数据写入&#xff08;Writer&#xff09;2.4 性能设置 三、案例…

AcWing 1207 大臣的旅费(树状DP + 注释详解)

[题目概述] 很久以前&#xff0c;T 王国空前繁荣。 为了更好地管理国家&#xff0c;王国修建了大量的快速路&#xff0c;用于连接首都和王国内的各大城市。 为节省经费&#xff0c;T 国的大臣们经过思考&#xff0c;制定了一套优秀的修建方案&#xff0c;使得任何一个大城市都…

React18原理: 核心包结构与两大工作循环

React核心包结构 1 ) react react基础包&#xff0c;只提供定义 react组件(ReactElement)的必要函数一般来说需要和渲染器(react-dom,react-native)一同使用在编写react应用的代码时, 大部分都是调用此包的api比如, 我们定义组件的时候&#xff0c;就是它提供的class Demo ext…

Excel一键导入导出-EasyPOI

EasyPOI是一款优秀的开源Java库&#xff0c;专为简化和优化Excel文件的导入导出操作而设计。下面&#xff0c;我会介绍EasyPOI在项目中使用EasyPOI&#xff0c;实现Excel文件的高效操作。帮助读者全面了解和掌握这一工具。 EasyPOI简介 官网&#xff1a; http://www.wupaas.co…