Steven D'Aprano wrote: > On Tue, 27 Feb 2007 20:31:43 -0800, Scott David Daniels wrote: > >>> def findallfiles(self, base): >>> self.results = [] >>> for root,dirs,files in os.walk(base): >>> os.chdir(root) >> ^^^ Mistake here, don't change directories during os.walk ^^^ > > I came across this problem some time ago. I had to walk a directory tree, > calling an external program on each file. Unfortunately, that external > program wrote directly to the current working directory, which caused all > sorts of havoc. This is how I dealt with it: > > > def unbin(where): > """Walk through a directory tree, calling macunpack to extract the > contents of MacBinary files. > """ > def _unbin(data, dirname, files): > for oldname in files: > fullname = os.path.normpath(os.path.join(dirname, oldname)) > if os.path.isfile(fullname): > # Dammit, macunpack writes directly to the current > # working directory. Changing the cwd breaks the file > # tree walker, so we have to remember the current > # directory, change it to where we want to be, then > # change it back. > wd = os.getcwd() > os.chdir(dirname) > result = os.system('macunpack -f "%s"' % oldname) > if result == 0: > # Unpacking worked, so delete the original. > os.remove(oldname) > os.chdir(wd) # sigh... > > os.path.walk(where, _unbin, None) > > > Is there another (better) way of dealing with this sort of situation?
Does the problem occur if you pass an absolute path to os.walk()/os.path.walk()? Peter -- http://mail.python.org/mailman/listinfo/python-list