“春天像一个轻浮的姑娘,抚着你的额头,轻轻吻你,就不知去向”

                                                                                ——席勒

Python教程 第五期

注意:该项目用到了还没有学到的tkinter库,大家可以根据情况进行研究或者略过,该库在后面会讲到;是剩下的re库在上一期讲过了,可以当作复习。


不知道大家有没有经历过

我之前打开文件准备搜索的时候,看到了……这样壮阔的场面。

python tkinter 获取文件的拖入名称及内容_python

然后在不停转动的秒针的监视下,耐着性子找

当然微软也为我们提供了便利,文件搜索

但是有些是文件夹里的子文件和文件夹名字一摸一样,看着一下就蒙圈了

找到了之后,还需要整理出文件名

python tkinter 获取文件的拖入名称及内容_python tk选文件_02

然后心态就崩了

二百多个项目一个一个整理?

怕是千手观音也做不到吧

所以我就做了这个项目

python tkinter 获取文件的拖入名称及内容_python tk选文件_03

python tkinter 获取文件的拖入名称及内容_python tk选文件_04

这样就可以一步整理出所有的文件了

不止如此,它还可以搜索root(路径)(测试中,功能实现存在bug)、dirs(文件夹)

而搜索方式也十分多样,有不匹配(完全整理)、一般匹配(关键字搜索)和高级搜索(正则匹配式)

现在先把脚本给大家

main文件

#!/usr/bin/python# -*- coding:utf-8 -*-import tkinter as tkimport toolmod = "Mismatch"window = tk.Tk()entry_Matching_formula = tk.Entry(window,width=50)label_Matching_formula = tk.Label(window,text="输入关键字")entry_Matching_formula.insert(0,"findall(keyword,text)")list_Matching_formula = [label_Matching_formula,entry_Matching_formula ]entry_match = tk.Entry(window,width=50)label_match = tk.Label(window,text="输入匹配式(语言python)")list_match = [entry_match,label_match]def get_entry():    return entry_root.get()def paint_list(data):    for d in data:        print(d)def General_matching_method():    global mod    mod = "General_matching_method"    for m,f in list_match,list_Matching_formula:        f.pack_forget()        m.pack()def Mismatch():    global mod    mod = "Mismatch"    for m,f in list_match,list_Matching_formula:        m.pack_forget()        f.pack_forget()def Advanced_matching():    global mod    mod ="Advanced matching"    for m,f in list_match,list_Matching_formula:        m.pack_forget()        f.pack()def match(data):    if mod == "Mismatch":        pass    elif mod == "General_matching_method":        text = entry_match.get()        data = [d for d in data if text in d]    else:        text = entry_Matching_formula.get()        tool.advanced_matching(str(text))        from matching import matching        data =[matching(d) for d in data]    while [] in data:        data.remove([])    paint_list(data)class get():    def __init__(self):        pass    def get_root(self):        self.top = get_entry()        data = tool.file_name(self.top)["root"]        print(data)    def get_dirs(self):        self.top = get_entry()        data = tool.file_name(self.top)["dirs"]        match(data)    def get_files(self):        self.top = get_entry()        data = tool.file_name(self.top)["files"]        match(data)window.geometry("500x600")window.title("文件汇总工具")tk.Label(window,text="输入路径").pack()entry_root = tk.Entry(window,width=50)entry_root.pack()tk.Button(window,width=10,text="root",command=get().get_root).pack()tk.Button(window,width=10,text="dirs",command=get().get_dirs).pack()tk.Button(window,width=10,text="files",command=get().get_files).pack()radiobutton1 = tk.Radiobutton(window,text="高级匹配(正则匹配式)",value="Advanced matching",command=Advanced_matching)radiobutton2 = tk.Radiobutton(window,text="一般匹配法(关键字)",value="General matching method",command=General_matching_method)radiobutton3 = tk.Radiobutton(window,text="不匹配",value="Mismatch",command=Mismatch)radiobutton = [radiobutton1,radiobutton2,radiobutton3]for r in radiobutton:    r.pack()window.mainloop()

tool文件

#!/usr/bin/python# -*- coding:utf-8 -*-from os import walkfrom re import findalldef file_name(top):    root,dirs,files = [],[],[]    for r,d,f in walk(top=top,topdown=False):        root.append(r)        dirs.append(d)        files.append(f)    return {"root":root[-1],"dirs":dirs[-1],"files":files[-1]}def newly_build(text):    open("matching.py","w+").write("")    with open("matching.py","a+") as w:        data = text.split("\n")        w.write('''from re import findalldef matching(text):''')        for d in data:            w.write("   data = ")            w.write(d + "\n")            w.write("   return data")def general_matching_method(text,keyword):    data = findall(keyword,text)    return datadef advanced_matching(matching_formula):    newly_build(str(matching_formula))

请保证这两个文件在同一路径下,否则会报错

下面解释一些核心内容


模式


    因为匹配有三种模式,所以用一个全局变量专门储存mod是必不可少的

mod = "Mismatch"

匹配


关于“搜索”,这显然是核心功能之一

我们有两种匹配法

第一种是一般匹配法

def general_matching_method(text,keyword):    data = findall(keyword,text)    return data

这是关于关键字的,很简单。因为re正则匹配中提到过,这里不作赘述了

然后是第二种

高级匹配

def newly_build(text):    open("matching.py","w+").write("")  # 清空文件(创建文件)    with open("matching.py","a+") as w:  # 设置写入模式为“追加”        data = text.split("\n")          w.write('''from re import findalldef matching(text):''')        for d in data:            w.write("   data = ")            w.write(d + "\n")  # 写入用户输入的匹配式            w.write("   return data")

这个看起来很乱,其实仔细看就可以看懂

就是在另一个python文件中写入了一个函数

然后main文件再调动这个函数,就可以实现按照用户输入的匹配式来匹配获得的信息了

def match(data):    if mod == "Mismatch":        pass     elif mod == "General_matching_method":        text = entry_match.get()        data = [d for d in data if text in d]    else:   # 如果既不是“不匹配”也不是“一般匹配”        text = entry_Matching_formula.get()          tool.advanced_matching(str(text))        from matching import matching  # (重新)载入matching库中的matching方法        data =[matching(d) for d in data]    while [] in data:        data.remove([])    paint_list(data)

项目下载(均免费)


  1. 脚本【支持 高级搜索+一般搜索+不搜索+基本功能;特点:速度快功能全】

        下载链接:https://wws.lanzous.com/iexO9f2qz5i

        注意:这是自解压程序,解压后(建议放到C盘以免报错)双击main.py运行程序。统一解压码为wzdhwn        

    2.exe打包程序【支持一般搜索+不搜索+基本功能;特点:简介方便】

        下载链接:https://wws.lanzous.com/iT9mqf2qz4h