Changing directories in oswalk [was Re: Walk thru each subdirectory from a top directory]

Peter Otten __peter__ at web.de
Wed Feb 28 02:38:41 EST 2007


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



More information about the Python-list mailing list