# Verision 1.0 # Author: Walter Behrnes # # Description: # File Renaming utility # Use: # python renamePro.py # Options: # # Dependancies: # # Documentation: # # Examples: # # Notes: # # Bugs: # # Original: 08/14/08 # Revisions: # # To-do's: # from Tkinter import * from Dialog import Dialog from tkFileDialog import askdirectory from FileDialog import LoadFileDialog from ScrolledText import ScrolledText import os, glob, string, sys, re, shutil class Application(Frame): def __init__(self,master): Frame.__init__(self,master) self.grid() self.create_widgets() def create_widgets(self): #LABEL self.v = StringVar() self.label1 = Label(self,textvariable=self.v).grid(row=0, columnspan=4, sticky=N) self.v.set("PLEASE PICK A DIRECTORY") #FILE LIST self.frame = Frame(self, bd=2, relief=SUNKEN) self.scrollbar = Scrollbar(self.frame) self.scrollbar.pack(side=RIGHT, fill=Y) self.listbox1 = Listbox(self.frame, bd=2, selectmode=EXTENDED, exportselection=0, yscrollcommand=self.scrollbar.set) self.listbox1.pack() self.scrollbar.config(command=self.listbox1.yview) self.frame.grid(row=1,column=0,rowspan=10) #FILE BROWSER BUTTON self.fileBrowser= Button(self, text='Open Directory', command=self.browse).grid(row=11,column=0) #FILE TYPE self.v1 = IntVar() self.checkBox1 = Checkbutton(self,text='Limit File View: ',variable=self.v1).grid(row=1,column=1, sticky=N+W) self.v2 = StringVar() self.entry1 = Entry(self,textvariable=self.v2).grid(row=1,column=2, sticky=N+W) self.v2.set("jpg") #FILE DISPLAY self.v3 = IntVar() self.checkBox2 = Checkbutton(self,text='Limit File Display: ',variable=self.v3).grid(row=2,column=1, sticky=N+W) self.v4 = StringVar() self.entry2 = Entry(self, textvariable=self.v4).grid(row=2,column=2,sticky=N+W) self.v4.set("Enter Search String") #REFRESH BUTTON self.refresh = Button(self,text='Refresh Directory', command = self.refresh).grid(row=3,column=1,columnspan=2, sticky=N) Label(self,text="___________________________________________________________________").grid(row=15,column=0,columnspan=4) #RENAME CONTROLS self.frame2 = Frame(self, bd=0, relief=SUNKEN) self.frame3 = Frame(self.frame2, bd=0, relief=SUNKEN) self.frame4 = Frame(self.frame2, bd=0, relief=SUNKEN) #ADD PREFIX self.v5 = IntVar() self.checkBox3 = Checkbutton(self.frame3,text='ADD PREFIX: ',variable=self.v5).grid(row=0,column=0, sticky=W) self.prefix = StringVar() self.entry3 = Entry(self.frame4,textvariable=self.prefix).pack(side=TOP) self.prefix.set("PREFIX") #RENAME self.v6 = IntVar() self.checkBox4 = Checkbutton(self.frame3,text='COMPLETE RENAME: ',variable=self.v6).grid(row=1,column=0, sticky=W) self.newName = StringVar() self.entry4 = Entry(self.frame4,textvariable=self.newName).pack(side=TOP) self.newName.set("NewName") #REPLACE self.v7 = IntVar() self.checkBox5 = Checkbutton(self.frame3,text='SEARCH & REPLACE: ',variable=self.v7).grid(row=2,column=0, sticky=W) self.find = StringVar() self.entry5 = Entry(self.frame4,textvariable=self.find).pack(side=TOP) self.find.set("SearchFor") self.replace = StringVar() self.entry6 = Entry(self.frame4,textvariable=self.replace).pack(side=TOP) self.replace.set("ReplaceWith") Label(self.frame3,text='').grid(row=3,column=0, sticky=W) #RENUMBER self.v8 = IntVar() self.checkBox6 = Checkbutton(self.frame3,text='NUMBER (Start Num): ',variable=self.v8).grid(row=4,column=0, sticky=W) self.startNum = StringVar() self.entry7 = Entry(self.frame4,textvariable=self.startNum).pack(side=TOP) self.startNum.set("1") #FRAME PADDING self.v9 = IntVar() self.checkBox7 = Checkbutton(self.frame3,text='PADDING: ',variable=self.v9).grid(row=5,column=0, sticky=W) self.padding = StringVar() self.entry8 = Entry(self.frame4,textvariable=self.padding).pack(side=TOP) self.padding.set("3") self.v10 = IntVar() self.checkBox8 = Checkbutton(self.frame3,text='DOT NUMBER [name.#.ext] ',variable=self.v10).grid(row=6,column=0, sticky=W) Label(self.frame4,text='').pack(side=TOP) Label(self.frame4,text='').pack(side=TOP) Label(self.frame4,text='').pack(side=TOP) self.v11 = IntVar() self.checkBox9 = Checkbutton(self.frame3,text='REMOVE EXTENTION',variable=self.v11).grid(row=7,column=0, sticky=W) self.v12 = IntVar() self.checkBox10 = Checkbutton(self.frame3,text='BackUp Files',variable=self.v12).grid(row=8,column=0, sticky=W) self.frame3.pack(side=LEFT) self.frame4.pack(side=RIGHT) self.frame2.grid(row=19,column=0,columnspan=3, rowspan=10,sticky=N+W) Label(self,text="___________________________________________________________________").grid(row=29,column=0,columnspan=4) self.frame5 = Frame(self, bd=0, relief=SUNKEN) #PREVIEW self.preview = Button(self.frame5,text='Preview', command = self.preview).pack(side=LEFT) #RENAME self.rename = Button(self.frame5,text='Rename', command = self.launchRename).pack(side=LEFT) self.frame5.grid(row=35,column=0,columnspan=4, rowspan=1,sticky=N) #TEXT WIDGET iframe5 = Frame(self, bd=2, relief=SUNKEN) self.text=Text(iframe5, height=10, width =70) # read the file in the update function; create Text & Scrollbar only once self.text.pack(side=LEFT, fill=X, padx=5) sb = Scrollbar(iframe5, orient=VERTICAL,command=self.text.yview) sb.pack(side=RIGHT, fill=Y) self.text.configure(yscrollcommand=sb.set) iframe5.grid(row=37, column = 0, columnspan=4) #FILE BROWSER def browse(self): directory = askdirectory(title="select directory", mustexist=1) if not directory: print "cancelled" else: print "selected", directory self.listInsert(directory) #REFRESH LIST def refresh(self): directory = self.v.get() self.listInsert(directory) #INSERT INTO LIST def listInsert(self, directory): parse = self.v1.get() parseFor = self.v2.get() search = self.v3.get() searchFor = self.v4.get() self.v.set(directory) self.listbox1.delete(0, END) dirList = os.listdir(directory) #SORT DIRECTORY dirList.sort() for infile in dirList: if os.path.isdir(infile): print "NOT FILE" else: if parse == 1: ext = os.path.splitext(infile)[1] if ext == ("."+parseFor): if search == 1: #TEST IF SEARCHSTRING IS IN FILE NAME if re.search(searchFor,infile): self.listbox1.insert(END, infile) else: self.listbox1.insert(END, infile) else: if search == 1: #TEST IF SEARCHSTRING IS IN FILE NAME if re.search(searchFor,infile): self.listbox1.insert(END, infile) else: self.listbox1.insert(END, infile) def getPadding(self,num,pad): xx = "_" if pad == 1: xx = '%01d' % (num) if pad == 2: xx = '%02d' % (num) if pad == 3: xx = '%03d' % (num) if pad == 4: xx = '%04d' % (num) if pad == 5: xx = '%05d' % (num) if pad == 6: xx = '%06d' % (num) if pad == 7: xx = '%07d' % (num) if pad == 8: xx = '%08d' % (num) if pad == 9: xx = '%09d' % (num) if pad >= 10: print "MAX PADDING OF 9 SETTING PADDING TO 9" xx = '%09d' % (num) return xx def configName(self,theItem,getNum): #GET VARIABLES addPrefix = self.v5.get() getPrefix = self.prefix.get() doRename = self.v6.get() getRename = self.newName.get() doSearch = self.v7.get() getSearch = self.find.get() getReplace = self.replace.get() doRenumber = self.v8.get() doPadd = self.v9.get() getPadd = int(self.padding.get()) doDot = self.v10.get() noExt = self.v11.get() theExt = os.path.splitext(theItem)[1] theName = os.path.splitext(theItem)[0] #SET NAME if doRename == 1: theName = getRename #SEARCH AND REPLACE if doSearch == 1: print "SEARCH AND REPLACE" print theName+" in "+getSearch search = string.find(theName, getSearch) print search if search >=0: print "FOUND MATCH" theName =string.replace(theName, getSearch,getReplace) print theName #SET PREFIX if addPrefix == 1: theName = getPrefix+theName #CONFIG NAME if doRenumber == 1: if doPadd == 1: xx =self.getPadding(getNum,getPadd) if doDot == 1: if noExt == 1: theNewName = theName+"."+xx else: theNewName = theName+"."+xx+theExt else: if noExt == 1: theNewName = theName+xx else: theNewName = theName+xx+theExt else: if doDot == 1: if noExt == 1: theNewName = theName+"."+str(getNum) else: theNewName = theName+"."+str(getNum)+theExt else: if noExt == 1: theNewName = theName+str(getNum) else: theNewName = theName+str(getNum)+theExt else: if noExt == 1: theNewName = theName else: theNewName = theName+theExt return theNewName def preview(self): #ALLOW EDITING self.text.config(state=NORMAL) #GET SELECTED FILES items = self.listbox1.curselection() #CLEAR PREVIEW TEXT self.text.delete(0.0, END) #SHOW PREVIEW getNum = int(self.startNum.get()) for item in items: #GET CURRENT SELECTED ITEM theItem = self.listbox1.get(item,item)[0] #CONFIGURE NAME theNewName = self.configName(theItem,getNum) #ALLOW EDITING self.text.config(state=NORMAL) #DISPLAY PREVIEW self.text.insert(END,theItem+" ==> "+theNewName+"\n") #DISABLE EDITING self.text.config(state=DISABLED) getNum += 1 def launchRename(self): #SEE IF USER WANTS TO BACK UP FILE backup = self.v12.get() #ALLOW EDITING self.text.config(state=NORMAL) #GET SELECTED FILES items = self.listbox1.curselection() #CLEAR PREVIEW TEXT self.text.delete(0.0, END) #SHOW PREVIEW getNum = int(self.startNum.get()) for item in items: #GET CURRENT SELECTED ITEM theItem = self.listbox1.get(item,item)[0] #CONFIGURE NAME theNewName = self.configName(theItem,getNum) #ALLOW EDITING self.text.config(state=NORMAL) #DISPLAY PREVIEW if backup == 1: directory = self.v.get()+"/renameBackup" if os.path.isdir(directory): print "directory: "+directory+" already exists, skipping creation of directory" else: os.mkdir(directory) old = self.v.get()+"/"+theItem new = directory+"/"+theItem shutil.copy(old,new) print "backup directory made: "+directory old = self.v.get()+"/"+theItem new = self.v.get()+"/"+theNewName os.rename(old, new) self.text.insert(END,"RENAMING: "+theItem+" ==> "+theNewName+"\n") #DISABLE EDITING self.text.config(state=DISABLED) getNum += 1 #MAIN PROGRAM root = Tk() root.title("renamePro") app = Application(root) root.mainloop()