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.mzph.cn/news/688108.shtml

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

相关文章

transformer 最简单学习1 输入层embeddings layer

词向量的生成可以通过嵌入层(Embedding Layer)来完成。嵌入层是神经网络中的一种常用层,用于将离散的词索引转换为密集的词向量。以下是一个典型的步骤: 建立词表:首先,需要从训练数据中收集所有的词汇&…

Instagram 账号被封如何申诉?ins账号解封经验分享

不知道各位在玩转海外社媒平台时有没有遇到过Instagram账号异常的情况,比如会出现账号受限、帖子发不出去、账号被封号等情况?Instagram账号如果被封不用马上弃用,我们可以先尝试一下申诉,看看能不能把账号解封。所以今天将会出一篇Instagra…

开工大吉!秀一下我们假期の战绩

开工大吉,新年新气象 首先祝大家开工大吉,新年新气象。 祝我的粉丝股东们都能:顺利上岸,升职加薪,日进斗金! 开工就要冲冲冲! 春节假期我是好好放松了,在努力克制自己不要像之前…

10万日活服务器配置选择,费用价格明细

阿里云10万人服务器配置多少钱一年?可以选择阿里云4核8G服务器,云服务器ECS通用算力u1是955.58元一年,云服务器c7是3000元左右一年,如果是轻量应用服务器价格会更划算一些,阿里云服务器网aliyunfuwuqi.com整理日活10万…

设计模式的目的

编写软件过程中,程序员面临着来自耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性等多方面的挑战,设计模式是为了让程序(软件),具有更好的: 代码重用性(即:相同功能的代码&#…

VSCODE上使用python_Django

接上篇 https://blog.csdn.net/weixin_44741835/article/details/136135996?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22136135996%22%2C%22source%22%3A%22weixin_44741835%22%7D VSCODE官网: Editing Python …

git操作--->在远程删除了某个分支,但本地使用git branch -r的时候还是会显示某个分支存在是什么原因

💕又迷糊了哈哈,以为自己命令执行错了,结果可能是缓存的原因:💕 😂如果你发现使用 git branch -r 命令显示了一个远程没有的分支,这可能是由以下几个原因造成的:😂 缓存…

My desktop didn‘t come with the Bluetooth.

You didnt turn on the Bluetooth on PC and phone.Turn on it to control your phone. My desktop didnt come with the Bluetooth. 电脑控制手机的时候,电脑蓝牙没打开 电脑蓝牙打开步骤 电脑蓝牙的小图标打开了 手机上可以看到计算机了【Thinkpad-T440p-zwf】 无…

Java面向对象案例之设计用户去ATM机存款取款(三)

需求及思路分析 业务代码需求: 某公司要开发“银行管理系统”,请使用面向对象的思想,设计银行的储户信息,描述存款、取款业务。 储户类的思路分析: 属性:用户姓名、密码、身份证号、账号、帐户余额 方法&a…

【自然语言处理】实验3,文本情感分析

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现(实验满分),只展示主要任务实验结果,如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题,也欢…

Zabbix利用python脚本监控专线状态

需要用python脚本模拟登录交换机或者路由器,去执行ping命令,最终返回结果true和false import paramikodef ssh_ping(host, port, username, password, target_ip):client paramiko.SSHClient()client.set_missing_host_key_policy(paramiko.AutoAddPol…

洛谷P5719 分类平均 题解

#题外话&#xff08;第32篇题解&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P5719 #思路&#xff08;注意一下分类计数、i<n这些问题就行&#xff09; #代码 #include <bits/stdc.h> using namespace std; int main() {int n,k,cnt0;double…

Java学习笔记2024/2/16

知识点 面向对象 题目1&#xff08;完成&#xff09; 定义手机类&#xff0c;手机有品牌(brand),价格(price)和颜色(color)三个属性&#xff0c;有打电话call()和sendMessage()两个功能。 请定义出手机类&#xff0c;类中要有空参、有参构造方法&#xff0c;set/get方法。 …

第13章 网络 Page741~744 asio核心类 ip::tcp::socket

1. ip::tcp::socket liburl库使用"curl*" 代表socket 句柄 asio库使用ip::tcp::socket类代表TCP协议下的socket对象。 将“句柄”换成“对象”,因为asio库是不打折扣的C库 ip::tcp::socket提供一下常用异步操作都以async开头 表13-3 tcp::socket提供的异步操作 …

[嵌入式系统-28]:开源的虚拟机监视器和仿真器:QEMU(Quick EMUlator)与VirtualBox、VMware Workstation的比较

目录 一、QEMU概述 1.1 QEMU架构 1.2 QEMU概述 1.3 什么时候需要QEMU 1.4 QEMU两种操作模式 1.5 QEMU模拟多种CPU架构 二、QEMU与其他虚拟机的比较 2.1 常见的虚拟化技术 2.1 Linux KVM 2.2 Windows VirtualBox 2.3 Windows VMware workstation 三、VirtualBox、VM…

Microsoft SQL Server 2012 CONVERT(VARCHAR(100), GETDATE(), 0); 各个数字的含义

如果是2016以上的&#xff0c;可以直接诶去官网查看&#xff0c;官网链接&#xff1a;CAST 和 CONVERT (Transact-SQL) - SQL Server | Microsoft Learn 这里给的链接是2016的&#xff0c;可以坐上角调整数据库版本&#xff0c;然后搜索convert 这是我的数据库版本&#xff1…

Vue22 Vue监测数据改变的原理_数组

实例 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>Vue监测数据改变的原理_数组</title><!-- 引入Vue --><script type"text/javascript" src"../js/vue.js"></script>&…

fish终端下conda activate失败

【问题】fish终端下激活conda环境报错&#xff1a; >> conda activate base CondaError: Run conda init before conda activate ## 然而运行 conda init fish 仍旧无法解决【解决】 参考&#xff1a;https://github.com/conda/conda/issues/11079 方法一&#xf…

log_error_verbosity参数详解

参数说明 控制每条日志信息的详细程度。 默认: log_error_verbosity = default , terse、default、verbose三选一 terse模式下,返回的消息只包括严重性、主要文本以及位置;这些东西通常放在一个单一行中。 default模式生成的消息包括上面的信息加上任何细节、提示或者…

2024.02.18作业

1. 使用fgets统计给定文件的行数 #include <stdio.h> #include <stdlib.h> #include <string.h>int main(int argc, char const *argv[]) {if (argc ! 2){puts("input file error");puts("usage:./a.out filename");return -1;}FILE* f…