54
utility for a photo browser may elect to use percent signs for placeholders such as the
current date, image sequence number, or file format:
>>> import time, os.path
>>> photofiles = ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']
>>> class BatchRename(Template):
... delimiter = '%'
>>> fmt = raw_input('Enter rename style (%d-date %n-seqnum %f-format): ')
Enter rename style (%d-date %n-seqnum %f-format): Ashley_%n%f
>>> t = BatchRename(fmt)
>>> date = time.strftime('%d%b%y')
>>> for i, filename in enumerate(photofiles):
... base, ext = os.path.splitext(filename)
... newname = t.substitute(d=date, n=i, f=ext)
... print '{0} --> {1}'.format(filename, newname)
img_1074.jpg --> Ashley_0.jpg
img_1076.jpg --> Ashley_1.jpg
img_1077.jpg --> Ashley_2.jpg
Another application for templating is separating program logic from the details of multiple
output formats. This makes it possible to substitute custom templates for XML files, plain
text reports, and HTML web reports.
11.3. Working with Binary Data Record Layouts
The
struct
module provides
pack()
and
unpack()
functions for working with variable
length binary record formats. The following example shows how to loop through header
information in a ZIP file without using the
zipfile
module. Pack codes
"H"
and
"I"
represent two and four byte unsigned numbers respectively. The
"<"
indicates that they
are standard size and in little-endian byte order:
import struct
data = open('myfile.zip', 'rb').read()
start = 0
for i in range(3): # show the first 3 file headers
start += 14
fields = struct.unpack('<IIIHH', data[start:start+16])
crc32, comp_size, uncomp_size, filenamesize, extra_size = fields
start += 16
filename = data[start:start+filenamesize]
start += filenamesize
extra = data[start:start+extra_size]
print filename, hex(crc32), comp_size, uncomp_size
start += extra_size + comp_size # skip to the next header
11.4. Multi-threading
Threading is a technique for decoupling tasks which are not sequentially dependent.