os.walk
returns a generator, that creates a tuple of values (current_path, directories in current_path, files in current_path).
Every time the generator is called it will follow each directory recursively until no further sub-directories are available from the initial directory that walk was called upon.
As such,
os.walk('C:\dir1\dir2\startdir').next()[0] # returns 'C:\dir1\dir2\startdir' os.walk('C:\dir1\dir2\startdir').next()[1] # returns all the dirs in 'C:\dir1\dir2\startdir' os.walk('C:\dir1\dir2\startdir').next()[2] # returns all the files in 'C:\dir1\dir2\startdir'
So
import os.path .... for path, directories, files in os.walk('C:\dir1\dir2\startdir'): if file in files: print('found %s' % os.path.join(path, file))
or this
def search_file(directory = None, file = None): assert os.path.isdir(directory) for cur_path, directories, files in os.walk(directory): if file in files: return os.path.join(directory, cur_path, file) return None
or if you want to look for file you can do this:
import os def search_file(directory = None, file = None): assert os.path.isdir(directory) current_path, directories, files = os.walk(directory).next() if file in files: return os.path.join(directory, file) elif directories == '': return None else: for new_directory in directories: result = search_file(directory = os.path.join(directory, new_directory), file = file) if result: return result return None