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