Package fabio
[hide private]
[frames] | no frames]

Source Code for Package fabio

  1   
  2  import re, os # -> move elsewhere? 
  3   
4 -def construct_filename(*args, **kwds):
5 raise Exception("You probably want fabio.jump_filename")
6 7 8 9 FILETYPES = { 10 # extension NNNimage fabioclass 11 # type consistency - always use a list if one case is 12 'edf' : ['edf'], 13 'cor' : ['edf'], 14 'pnm' : ['pnm'], 15 'pgm' : ['pnm'], 16 'pbm' : ['pnm'], 17 'tif' : ['tif'], 18 'tiff' : ['tif'], 19 'img' : ['adsc', 'OXD', 'HiPiC'], 20 'mccd' : ['marccd'], 21 'mar2300': ['mar345'], 22 'sfrm' : ['bruker100'], 23 'msk' : ['fit2dmask'], 24 'spr' : ['fit2dspreadsheet'], 25 'dm3' : ['dm3'], 26 'kcd' : ['kcd'], 27 'cbf' : ['cbf'], 28 } 29 30 # Add bzipped and gzipped 31 for key in FILETYPES.keys(): 32 FILETYPES[key + ".bz2"] = FILETYPES[key] 33 FILETYPES[key + ".gz"] = FILETYPES[key] 34 35 36 # Compressors 37 38 COMPRESSORS = {} 39 40 try: 41 lines = os.popen("gzip -h 2>&1").read() 42 # Looking for "usage" 43 if "sage" in lines: 44 COMPRESSORS['.gz'] = 'gzip -dc ' 45 else: 46 COMPRESSORS['.gz'] = None 47 except: 48 COMPRESSORS['.gz'] = None 49 50 try: 51 lines = os.popen("bzip2 -h 2>&1").read() 52 # Looking for "usage" 53 if "sage" in lines: 54 COMPRESSORS['.bz2'] = 'bzip2 -dc ' 55 else: 56 COMPRESSORS['.bz2'] = None 57 except: 58 COMPRESSORS['.bz2'] = None 59 60 # print COMPRESSORS 61
62 -def getnum(name):
63 """ 64 # try to figure out a file number 65 # guess it starts at the back 66 """ 67 stem , num, post_num = numstem(name) 68 try: 69 return int(num) 70 except ValueError: 71 return None
72
73 -class filename_object:
74 """ 75 The 'meaning' of a filename 76 """
77 - def __init__(self, stem, 78 num=None, 79 directory=None, 80 format=None, 81 extension=None, 82 postnum=None, 83 digits=4):
84 self.stem = stem 85 self.num = num 86 self.format = format 87 self.extension = extension 88 self.digits = digits 89 self.postnum = postnum 90 self.directory = directory
91 #print self.str() 92
93 - def str(self):
94 """ Return a string representation """ 95 fmt = "stem %s, num %s format %s extension %s " + \ 96 "postnum = %s digits %s dir %s" 97 return fmt % tuple([str(x) for x in [ 98 self.stem , 99 self.num , 100 self.format , 101 self.extension , 102 self.postnum , 103 self.digits , 104 self.directory ] ])
105 106
107 - def tostring(self):
108 """ 109 convert yourself to a string 110 """ 111 name = self.stem 112 if self.digits is not None and self.num is not None: 113 fmt = "%0" + str(self.digits) + "d" 114 name += fmt % self.num 115 if self.postnum is not None: 116 name += self.postnum 117 if self.extension is not None: 118 name += self.extension 119 if self.directory is not None: 120 name = os.path.join(self.directory, name) 121 return name
122 123
124 -def numstem(name):
125 """ cant see how to do without reversing strings 126 Match 1 or more digits going backwards from the end of the string 127 """ 128 reg = re.compile(r"^(.*?)(-?[0-9]{0,9})(\D*)$") 129 #reg = re.compile("""(\D*)(\d\d*)(\w*)""") 130 try: 131 res = reg.match(name).groups() 132 #res = reg.match(name[::-1]).groups() 133 #return [ r[::-1] for r in res[::-1]] 134 if len(res[0]) == len(res[1]) == 0: # Hack for file without number 135 return [res[2], '', ''] 136 return [ r for r in res] 137 except AttributeError: # no digits found 138 return [name, "", ""]
139
140 -def deconstruct_filename(filename):
141 """ 142 Break up a filename to get image type and number 143 """ 144 direc , name = os.path.split(filename) 145 if len(direc) == 0: 146 direc = None 147 parts = os.path.split(name)[-1].split(".") 148 # loop back from end 149 compressed = False 150 extn = "" 151 postnum = "" 152 ndigit = 4 153 if parts[-1] in ["gz", "bz2"]: 154 extn = "." + parts[-1] 155 parts = parts[:-1] 156 compressed = True 157 if parts[-1] in FILETYPES.keys(): 158 typ = FILETYPES[parts[-1]] 159 extn = "." + parts[-1] + extn 160 try: 161 stem , numstring, postnum = numstem(".".join(parts[:-1])) 162 num = int(numstring) 163 ndigit = len(numstring) 164 except: 165 # There is no number - hence make num be None, not 0 166 num = None 167 stem = "".join(parts[:-1]) 168 else: 169 # Probably two type left 170 if len(parts) == 1: 171 # Probably GE format stem_numb 172 parts2 = parts[0].split("_") 173 try: 174 num = int(parts2[-1]) 175 ndigit = len(parts2[-1]) 176 typ = ['GE'] 177 stem = "_".join(parts2[:-1]) + "_" 178 except: 179 pass 180 else: 181 try: 182 num = int(parts[-1]) 183 ndigit = len(parts[-1]) 184 typ = ['bruker'] 185 stem = ".".join(parts[:-1]) + "." 186 except: 187 typ = None 188 extn = "." + parts[-1] + extn 189 try: 190 stem , numstring, postnum = numstem(".".join(parts[:-1])) 191 num = int(numstring) 192 ndigit = len(numstring) 193 except: 194 raise 195 # raise Exception("Cannot decode "+filename) 196 obj = filename_object(stem, 197 num=num, 198 directory=direc, 199 format=typ, 200 extension=extn, 201 postnum=postnum, 202 digits=ndigit) 203 204 return obj
205 206
207 -def next_filename(name, padding=True):
208 """ increment number """ 209 obj = deconstruct_filename(name) 210 obj.num += 1 211 if not padding: 212 obj.digits = 0 213 return obj.tostring()
214
215 -def previous_filename(name, padding=True):
216 """ decrement number """ 217 obj = deconstruct_filename(name) 218 obj.num -= 1 219 if not padding: 220 obj.digits = 0 221 return obj.tostring()
222
223 -def jump_filename(name, num, padding=True):
224 """ jump to number """ 225 obj = deconstruct_filename(name) 226 obj.num = num 227 if not padding: 228 obj.digits = 0 229 return obj.tostring()
230 231
232 -def extract_filenumber(name):
233 """ extract file number """ 234 obj = deconstruct_filename(name) 235 return obj.num
236