[Python-Dev] os.path.walk() lacks 'depth first' option (original) (raw)

Tim Peters tim.one@comcast.net
Mon, 21 Apr 2003 22:44:58 -0400


[Noah Spurrier]

I write these little directory/file filters quite often. I have come across this problem of renaming the directories you are traversing before.

[Martin v. L=F6wis]

I still can't understand why you can't use os.path.walk for that. Did you know that you can modify the list that is passed to the callback, and that walk will continue to visit the elements in the = list?

Let's spell it out. Say the directory structure is like so:

a/ b/ c/ d/ e/

and we want to stick "x" at the end of each directory name. The firs= t thing the callback sees is

arg, "a", ["b", "e"]

The callback can rename b and e, and change the contents of the fname= s list to ["bx", "ex"] so that walk will find the renamed directories. Etc.

This works:

""" import os

def renamer(arg, dirname, fnames): for i, name in enumerate(fnames): if os.path.isdir(os.path.join(dirname, name)): newname =3D name + "x" os.rename(os.path.join(dirname, name), os.path.join(dirname, newname)) fnames[i] =3D newname # crucial!

os.path.walk('a', renamer, None) """

It's certainly less bother renaming bottom-up; this works too (given = the last walk() generator implementation I posted):

""" import os

for root, dirs, files in walk('a', topdown=3DFalse): for d in dirs: os.rename(os.path.join(root, d), os.path.join(root, d + 'x')) """

A possible surprise is that neither of these renames 'a'.