1
2 import re, os
3
5 raise Exception("You probably want fabio.jump_filename")
6
7
8
9 FILETYPES = {
10
11
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
31 for key in FILETYPES.keys():
32 FILETYPES[key + ".bz2"] = FILETYPES[key]
33 FILETYPES[key + ".gz"] = FILETYPES[key]
34
35
36
37
38 COMPRESSORS = {}
39
40 try:
41 lines = os.popen("gzip -h 2>&1").read()
42
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
53 if "sage" in lines:
54 COMPRESSORS['.bz2'] = 'bzip2 -dc '
55 else:
56 COMPRESSORS['.bz2'] = None
57 except:
58 COMPRESSORS['.bz2'] = None
59
60
61
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
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
92
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
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
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
130 try:
131 res = reg.match(name).groups()
132
133
134 if len(res[0]) == len(res[1]) == 0:
135 return [res[2], '', '']
136 return [ r for r in res]
137 except AttributeError:
138 return [name, "", ""]
139
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
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
166 num = None
167 stem = "".join(parts[:-1])
168 else:
169
170 if len(parts) == 1:
171
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
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
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
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
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
236