# YASARA BioTools # Visit www.yasara.org for more... # Copyright by Elmar Krieger # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import os,string,shutil,fnmatch,zipfile # ====================================================================== # D I S C F U N C T I O N G R O U P (D S C) # ====================================================================== # MAKE PATH ABSOLUTE # ================== def abspath(path): return(os.path.abspath(path)) # CALCULATE FILE CHECKSUM # ======================= def checksum(path): checksum=0 file=open(path) pos=1 a=0 b=0 while (1): data=file.read(1000000) datalen=len(data) i=0 while (i0 and filename[i] not in string.digits): i=i-1 while (i>=0): num=ord(filename[i]) if (num<48 or num>57): break num=num+1 if (num==58): num=48 filename=filename[:i]+chr(num)+filename[i+1:] if (num!=48): break i=i-1 return(filename) # MAKE DIRECTORY CHAIN # ==================== def makedirs(path,permissions=0x1ed): if (not os.path.exists(path)): os.makedirs(path,permissions) # THE PERMISSIONS ARE NOT ALWAYS SET CORRECTLY, DO IT AGAIN chmod(path,permissions) # GET MD5SUM # ========== def md5sum(filename): content=open(filename).read() md5sum=md5.new(content).digest() md5str="" for ch in md5sum: hexstr=hex(ord(ch)) if (len(hexstr)==3): md5str+='0'+hexstr[-1] else: md5str+=hexstr[-2:] return(md5str) # GET THE MODIFICATION TIME OF A FILE # =================================== def modtime(filename): if (not os.path.exists(filename)): return(0) else: return(os.path.getmtime(filename)) # GET ALL MODIFICATION TIMES FOR A LIST OF FILES # ============================================== def modtimes(filelist): timelist=[] for filename in filelist: if (not os.path.exists(filename)): timelist.append(0) else: timelist.append(os.path.getmtime(filename)) return(timelist) # CHECK IF TWO FILES ARE THE SAME # =============================== def havesamecontent(filename1,filename2): if (not os.path.exists(filename1) or not os.path.exists(filename2)): return(0) content1=open(filename1,"r").read() content2=open(filename2,"r").read() return (content1==content2) # BUILD TEMPORARY FILE NAME # ========================= def tmpfilename(filename): dotpos=filename.rfind(".") slashpos=filename.rfind(os.sep) if (dotpos==-1 or dotpos=modtime): dellist.append(filename) print(dellist) raw_input("Press to delete everything listed above...") for filename in dellist: print("Removing ",filename) if (os.path.isdir(filename)): rmdir(filename) else: remove(filename) # RENAME A FILE # ============= def rename(srcfilename,dstfilename): if (srcfilename and dstfilename and os.path.exists(srcfilename)): os.rename(srcfilename,dstfilename) # DELETE ALL MATCHING FILES # ========================= def removematch(path): if (type(path)==type([])): for pathname in path: removematch(pathname) else: # NORMALIZE PATH, IMPORTANT TO CONVERT UNIX FORWARD TO WINDOWS BACKWARD SLASHES path=os.path.normpath(os.path.normcase(path)) # CREATE LIST OF ALL THE FILENAMES IN THE DIRECTORY SPECIFIED BY PATH path=os.path.split(path) wildcard=path[1] dir=path[0] if (dir==""): dir="." try: files=os.listdir(dir) except: return(0) # DELETE ALL LIST ENTRIES THAT DO NOT MATCH THE WILDCARD GIVEN IN PATH for name in files: # CHECK IF FILENAME MATCHES WILDCARD # INCLUDING A POSSIBLE _MOD APPENDIX (LIKE EMBL DSSP FILES) if (fnmatch.fnmatch(name,wildcard)): remove(os.path.join(dir,name)) return(0) # SET MODIFICATION TIME # ===================== def setmodtime(filename,modtime): os.utime(filename,(modtime,modtime)) # COPY MODIFICATION TIME # ====================== def copymodtime(srcfilename,dstfilename): setmodtime(dstfilename,modtime(srcfilename)) # CHMOD A FILE # ============ def chmod(path,mods): if (type(path)==type([])): for pathname in path: chmod(pathname,mods) else: try: os.chmod(path,mods) except: print("Could not change permissions for ",path) # DELETE AN ENTIRE DIRECTORY INCLUDING ALL THE FILES # ================================================== def rmdir(path): if (os.path.exists(path)): shutil.rmtree(path,1) # REMOVE FILE EXTENSION # ===================== def rmext(filename): dotpos=filename.rfind(".") if (dotpos!=-1): filename=filename[:dotpos] return(filename) # GET FILE EXTENSION # ================== def ext(filename): dotpos=filename.rfind(".") if (dotpos!=-1): return(filename[dotpos+1:]) return("") # COUNT NUMBER OF FILENAMES PRESENT # ================================= def countpresent(filenamelist): count=0 for filename in filenamelist: if (os.path.exists(filename)): count=count+1 return(count) # UPDATE DIRECTORY # ================ # - srcpath IS A WILDCARD MATCHING THE FILES TO UPDATE # - dstdir IS THE NAME OF THE DESTINATION DIRECTORY # - excludelist CONTAINS EXCLUDED FILENAMES OR, .* TO EXCLUDE HIDDEN FILES def updatedir(srcpath,dstdir,contentchecked=1,recursive=0,obsoleted=0,mod=None,excludelist=[]): modfilelist=[] if (os.path.isdir(srcpath)): srcpath=os.path.join(srcpath,"*") srcfilelist=dirlist(srcpath,recursive) srcbaselist=[] for srcfilename in srcfilelist: srcbasename=os.path.basename(srcfilename) srcbaselist.append(srcbasename) if (srcbasename not in excludelist and (srcbasename[0]!='.' or ".*" not in excludelist)): dstfilename=os.path.join(dstdir,srcbasename) if (os.path.isdir(srcfilename)): if (recursive): if (not os.path.exists(dstfilename)): makedirs(dstfilename) updatedir(srcfilename,dstfilename,contentchecked,1,obsoleted,mod,excludelist) else: if ((contentchecked and not havesamecontent(srcfilename,dstfilename)) or (not contentchecked and modtime(srcfilename)>modtime(dstfilename))): copy(srcfilename,dstfilename,0,mod) modfilelist.append(dstfilename) if (obsoleted): # ALSO DELETE OBSOLETE FILES dstfilelist=dirlist(os.path.join(dstdir,os.path.basename(srcpath))) for dstfilename in dstfilelist: dstbasename=os.path.basename(dstfilename) if (dstbasename not in srcbaselist): remove(dstfilename) return(modfilelist) # ZIP A FILE # ========== def zip(filename): print("Deflating",filename) zipfilename=filename+".zip" zip=zipfile.ZipFile(zipfilename,"w",zipfile.ZIP_DEFLATED) zip.write(filename,os.path.basename(filename)) zip.close() remove(filename) # RETURN AN UNZIPPED FILE # ======================= def unzipped(filename): zipfilename=filename+".zip" zip=zipfile.ZipFile(zipfilename,"r",zipfile.ZIP_DEFLATED) data=zip.read(os.path.basename(filename)) zip.close() return(data)