【6.1】Tkinter小应用——递归查找文件夹下所有txt文件中的某参数配置

  • 代码
    涉及函数功能:
    • 返回指定文件夹下所有指定类型(代码以txt实例)的文件,递归查找
    • 根据给定的字符串(支持正则表达式),返回在所有txt文件中查找包含所给字符串的行
    • 将结果存放在xlsx文件中,第一列是文件路径,第二列是返回的行,匹配不上则为空
from tkinter import *
from tkinter import filedialog
import re
import os
import datetime
import xlwt
import time

file_dir = 'ini'
root = Tk()
root.geometry('480x270')
file_dir_var = StringVar()  # entry组件1的文本变量



# root.withdraw() #将Tk()实例隐藏,不然有个小框
# filepath=filedialog.askopenfilename (initialdir=r"C:\Users")  #askopenfilename,打开文件
# filepath=filedialog .askdirectory(initialdir=r"C:\Users") #askdirectory,打开文件夹
# print (filepath)
def start_find():  # 查找主函数
    dst_str.set
    # 必须要这句,不然dst_str没值
    print('待查找的字符串值是:%s ' % dst_str.get())  # 输出待香找的字符串
    dst_str_tmp = dst_str.get()
    print('待查找的文件路径是:%s' % file_dir_var.get())  # 输出待查找的文件夹路径
    file_dir = file_dir_var.get()

    listdir(file_dir, txtlist_name)  # 调用1istdir函数,得到txt文件路径
    Dest_text = ''
    workbook = xlwt.Workbook(encoding="utf-8")  # 新建表格,作为最终输出
    worksheet = workbook.add_sheet('查找结果统计')  # 新建名为PCF 上DNN配置统计的sheet页
    worksheet.write(0, 0, '文件名')  # 第一行第一列标题
    worksheet.write(0, 1, '匹配上的配置')  # 第 一行第二列标题
    col = 1  # excel的行,第一行是标题,从第二行开始
    row = 0  # excel的列
    for filedir1 in txtlist_name:
        file = open(filedir1, encoding='utf-8')  # 批x文件以GBK编码,需转换成Python识别的utf-8编码
        NoneFlag = True  # 配置是否为空的标志位,每个文件开始前重置
        for line in file:  # 单个文件中,按行遍历
            temp = re.findall(dst_str_tmp, line)
            # re.finda11两数查找1ine宁符串中符合条件的所有目标字符串
            # 打印找到包含字符串的所在的行
            if temp:
                NoneFlag = False  # 有配置,标志位置为False
                Dest_text = Dest_text + line
                worksheet.write(col, row, filedir1)  # 写入打开的配置文件名
                worksheet.write(col, row + 1, line)  # 找到的行作为字符串写入表格
                col += 1  # 行加1,下次写在下一列

        if NoneFlag:
            worksheet.write(col, row, filedir1)  # 单个文件检查完,判断是否没有配置
            worksheet.write(col, row + 1, '')  # 写入打开的配置文件名

        file.close()
    workbook.save(savefile())
    print('保存xlsx文件成功')


def savefile():
    result_filename_ = filedialog.asksaveasfilename(defaultextension='.xlsx')  # 保存文件,返回文件名,
    result_filename.set(result_filename_)
    return result_filename.get()  # result_filemame是字符串变量,返回get函数扌是宇符串


def select_dir_click():
    file_dir_var_ = filedialog.askdirectory(initialdir=r'C:')
    file_dir_var.set(file_dir_var_)
    file_dir = file_dir_var.get()
    print('执行点击选择目录后file_dir值:', file_dir)
    return file_dir


def listdir(path, list_name):  # 获取txt文件名的西数,传入参数为文件夹路径,空列表,返回用于存储文
    # 获取当前目录及子目录下文件
    for file in os.listdir(path):  # 返回指定文件路径下的文件夹和文件名的列表
        file_path = os.path.join(path, file)  # file_prth是文件路径和文件名的拼接,文件夹的
        if os.path.isdir(file_path):  # 判断file prth是不是文件夹,是文件夹就递归向
            listdir(file_path, list_name)
        elif os.path.splitext(file_path)[1] == '.txt':  # 如果是文件,判断是不是txt文件
            list_name.append(file_path)


txtlist_name = []  # 存放txt文件名的刎表
group = LabelFrame(root)
group.pack(padx=10, pady=20)
label1 = Label(group, text='目标文件夹:').grid(row=0, column=0)
label2 = Label(group, text='查找的字符串').grid(row=1, column=0)
label3 = Label(group, text='查找结果保存路径:').grid(row=2, column=0)

e1 = Entry(group, textvariable=file_dir_var, width=30)              # 显示选择后的目录,width为输入框长度,
e1.grid(row=0, column=1)

dst_str = StringVar()  # entry组件2的文本变量
e2 = Entry(group, textvariable=dst_str, width=30)       # 待输入目标字符串
e2.grid(row=1, column=1)

result_filename = StringVar()
e3 = Entry(group, width=30, textvariable=result_filename)
e3.grid(row=2, column=1)

bu1 = Button(group, text='选择目录', command=select_dir_click)
bu1.grid(row=0, column=2, sticky=W)
bu2 = Button(group, text='开始杳找', command=start_find)
bu2.grid(row=3, column=1, sticky=W)


mainloop()

  • 效果
posted @   qwaszx1!  阅读(171)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
HTML
点击右上角即可分享
微信分享提示