Windows文件检索、复制工具(Python Tkinter)

来源:互联网 发布:酒店市场数据分析 编辑:程序博客网 时间:2024/05/19 12:27

目前接到一个小任务,做一个Windows系统下的文件检索、复制工具。该任务采用Python自带的GUI 工具Tkinter书写界面,经过测试,功能稳定。


具体使用方法如下:

(1)上图中,方框3是tkinter写的文件检索、复制工具,其中“文件源路径”中输入的是方框1所在的路径信息,“文件目标路径”中输入的是方框2所在的路径信息,“待搜索文件名”

中输入的是带扩张名的文件名称。

切记要带扩展名!切记要带扩展名!切记要带扩展名!(重要的事情说三遍!)

(2)点击“搜索”,即可在“搜索到的同名文件列表”中显示目标文件夹中不同路径信息下的同名文件;

(3)点击列表中的目标文件,点击“复制”,即可完成复制操作,并有弹出框进行提示。

PS:若目标路径中已经存在目标文件,则会提示是否要覆盖!

PPS:该工具只能实现单个目标文件的检索、复制,后续小弟会进一步的完善。


具体的实现代码如下:

# -*- coding: UTF-8 -*- import osimport shutilimport collectionsfrom tkinter import *import tkinter.messageboxdef file_find_byName():    src=src_path.get()    dest=des_path.get()    name=file_name.get()#     src='C:/Users/xsw-hp/Desktop/Original'#     dest='D:/FileCopy'#     name='file.txt'        if os.path.exists(src)==False:        str="您输入的文件源路径不存在!"        tkinter.messagebox.showwarning("File_Copy Demo",str)        print("您输入的文件源路径不存在!")            else:        #1. 存储源文件夹路径和文件名信息的字典           fp=collections.OrderedDict()                #2. 存储目标文件序号和其在源文件夹中路径信息的字典                  fpp={}        count=0              #2.1 根据检索顺序自定义的目标文件序号            s=name.split('.')    #2.2 将目标文件名与扩展名分开                #3. 在原文件夹路径中搜索目标文件        for dn,dns,fns  in os.walk(src):                  for fl in fns:                            if ((os.path.splitext(fl)[0]==s[0]) and (os.path.splitext(fl)[1][1:]==s[1])) :                    if dn not in fp.keys():                        fp[dn]=[]                        fpp[count]=dn                        count+=1                    fp[dn].append(fl)                            #4. 打印原文件夹不同子目录下的同名目标文件列表        print('目标文件个数是:{0:^3},具体列表如下图所示:'.format(len(fpp)))                  file_listbox.delete(0, END)         if len(fpp)>0:                          str='目标文件个数是:{0:^3},具体列表如下图所示:'.format(len(fpp))              file_listbox.insert(END,str)               i=0             for k in fp.keys():                                   for ff in fp[k]:                    item=('{1:<2}---{0}').format(os.path.join(k,ff),i)                    file_listbox.insert(END,item)                i+=1           else:                        str="您要查找的目标文件不存在!"            tkinter.messagebox.showwarning("File_Copy Demo",str)            print("您要查找的目标文件不存在!")            def file_copy_byName():          src=src_path.get()    dest=des_path.get()    name=file_name.get()        #5. 在同名目标文件列表中,选择要进行操作的一个目标文件    if file_listbox.size()>1:        i=1        flag=0        while i<file_listbox.size():            if file_listbox.selection_includes(i):                flag=1                break            i+=1        if flag==1:            print(i)            str1=file_listbox.get(i).split('---')[1]             relative_path=str1[len(src)+1:-len(name)-1]            #           6. 确认目标文件在目标文件夹中的新路径信息                if len(relative_path)==0:                newpath=dest;            else:                                newpath=os.path.join(dest,relative_path)     #6.1 文件对应的新文件夹路径                           print('相对路径是: %s' % relative_path)            print('新的路径 是: %s' % newpath)            #           7. 从源文件夹到目标文件夹进行目标文件的复制操作                 if os.path.exists(newpath):                 #7.1 若新路径文件夹已经存在                flag1=0                flag2=0                for dns,dnss,fnss in os.walk(newpath):      #7.1.1 检索新路径文件夹中是否已经存在目标文件                        if len(dns)>len(newpath):                        break                    for fl in fnss:                        if(fl==name):                              flag3=int(tkinter.messagebox.askokcancel("File_Copy Demo",('目标文件  “{0}” 已经存在!您确定要覆盖它吗?').format(os.path.join(newpath,fl))))                              flag2=1                            if flag3==0:                                flag1=1                                str='您已经取消文件复制!'                                tkinter.messagebox.showinfo("File_Copy Demo",str)                                print('您已经取消文件复制!')                            break;                                                    #                             print(('目标文件  “{0}” 已经存在!您确定要覆盖它吗?').format(os.path.join(newpath,fl)))#                             Confirm=input('请输入 “Y/N”:');    #7.1.1.1 是否对新路径文件夹中已经存在目标文件进行覆盖#                             if Confirm=='Y':#                                 flag1=0#                                 flag2=1#                                 break;#                             else:#                                 flag1=1#                                 flag2=1#                                 print('您已经取消文件复制!')#                                 break;                    if(flag2==1):                        break                if(flag1==0):                               #7.1.2 目标文件的拷贝                    oldfile=os.path.join(src,name)                    shutil.copy(str1,newpath)                    str='已经复制 目标文件  "'+oldfile+'" 至 "'+ newpath+'" 。'                    tkinter.messagebox.showinfo("File_Copy Demo",str)                                else:                                        #7.2 若新路径文件夹还未建立,直接复制目标文件                os.makedirs(newpath)                oldfile=os.path.join(src,name)                shutil.copy(str1,newpath)                str='已经复制 目标文件  "'+oldfile+'" 至 "'+ newpath+'" 。'                tkinter.messagebox.showinfo("File_Copy Demo",str)                print(str)                                                                                                                        else:            str="您未选中任何文件!"            tkinter.messagebox.showwarning("File_Copy Demo",str)            print(str)            else:         str="您要查找的文件不存在!"        tkinter.messagebox.showwarning("File_Copy Demo",str)        print(str) # 0. Tkinter客户端界面的结构布局    root=Tk() root.title("File-Copy-By-Name")Label(root,width=15,text='文件源路径:',relief=RIDGE).grid(row=0,column=0,sticky=W)src_path=Entry(root,width=30,relief=RIDGE)src_path.grid(row=0,column=1,padx=5,pady=3,sticky=W)Label(root,width=15,text='文件目标路径:',relief=RIDGE).grid(row=1,column=0,sticky=W)des_path=Entry(root,width=30,relief=RIDGE)des_path.grid(row=1,column=1,padx=5,pady=3,sticky=W)Label(root,width=15,text='待搜索文件名:',relief=RIDGE).grid(row=2,column=0,sticky=W)file_name=Entry(root,width=23,relief=RIDGE)file_name.grid(row=2,column=1,padx=5,sticky=W)file_search=Button(root,padx=3,text='搜索',command=file_find_byName)file_search.grid(row=2,column=1,padx=5,pady=3,sticky=E)Label(root,width=39,pady=2,text='搜索到的同名文件列表',relief=RIDGE).grid(row=3,column=0,columnspan=2,padx=3,pady=3,sticky=W)file_copy=Button(root,padx=3,text='复制',command=file_copy_byName)file_copy.grid(row=3,column=1,padx=5,pady=3,sticky=E)file_listbox=Listbox(root,width=45,height=5,selectmode=BROWSE,relief=RIDGE)file_listbox.grid(row=4,column=0,columnspan=2,padx=3,pady=5)root.mainloop()  # file_copy_byName('C:/Users/xsw-hp/Desktop/Original','D:/FileCopy','finddup.py')   #0. 'file.txt'  'filepath.txt' 'sysTest.py'  'finddup.py'  '新建文本文档.txt'
















原创粉丝点击