Sometimes you need to perform an operation on the oldest of a set of files. Using get_oldest_file you could implement an age-based priority queue that processes files from oldest to newest. The list of files you pass in may be from a glob of a single directory or some more elaborate search routine.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
import os, glob, time, operator def get_oldest_file(files, _invert=False): """ Find and return the oldest file of input file names. Only one wins tie. Values based on time distance from present. Use of `_invert` inverts logic to make this a youngest routine, to be used more clearly via `get_youngest_file`. """ gt = operator.lt if _invert else operator.gt # Check for empty list. if not files: return None # Raw epoch distance. now = time.time() # Select first as arbitrary sentinel file, storing name and age. oldest = files, now - os.path.getctime(files) # Iterate over all remaining files. for f in files[1:]: age = now - os.path.getctime(f) if gt(age, oldest): # Set new oldest. oldest = f, age # Return just the name of oldest file. return oldest def get_youngest_file(files): return get_oldest_file(files, _invert=True) # Example. files = glob.glob('*.py') print 'oldest:', get_oldest_file(files) print 'youngest:', get_youngest_file(files)
Of course this is simpler in a shell with something like:
ls -t *.py |head -1 but often shelling out is not an option. And this recipe demonstrates some useful time math.