I have a file that may be in a different place on each user's machine. Is there a way to implement a search for the file? A way that I can pass the file's name and the directory tree to search in?
os.walk is the answer, this will find the first match:
import os def find(name, path): for root, dirs, files in os.walk(path): if name in files: return os.path.join(root, name)
And this will find all matches:
def find_all(name, path): result =  for root, dirs, files in os.walk(path): if name in files: result.append(os.path.join(root, name)) return result
And this will match a pattern:
import os, fnmatch def find(pattern, path): result =  for root, dirs, files in os.walk(path): for name in files: if fnmatch.fnmatch(name, pattern): result.append(os.path.join(root, name)) return result find('*.txt', '/path/to/dir')
I used a version of
os.walk and on a larger directory got times around 3.5 sec. I tried two random solutions with no great improvement, then just did:
paths = [line[2:] for line in subprocess.check_output("find . -iname '*.txt'", shell=True).splitlines()]
While it's POSIX-only, I got 0.25 sec.
From this, I believe it's entirely possible to optimise whole searching a lot in a platform-independent way, but this is where I stopped the research.