[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'.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4