import errno import fnmatch import os import sys # Avoid "maximum recursion depth exceeded" errors sys.setrecursionlimit(10000) def clamp(v, eps = 0.000001): """Round values close to zero to zero.""" if abs(v) < eps: return 0.0 else: return v def find_filenames_sub(path, pattern): try: for fn in os.listdir(path): for p in find_filenames_sub(os.path.join(path, fn), pattern): yield p except OSError, e: if e.errno != errno.ENOTDIR: raise if fnmatch.fnmatch(path, pattern): yield path def find_filenames(path, pattern): try: for fn in os.listdir(path): for p in find_filenames_sub(os.path.join(path, fn), pattern): yield p except OSError, e: if e.errno != errno.ENOTDIR: raise # At the top level we don't require a pattern match. yield path def find_files_or_stdin(paths, pattern): if not paths: yield None, sys.stdin else: for path in paths: for filename in find_filenames(path, pattern): f = open(filename) yield filename, f f.close()