os.walk help
hokiegal99
hokiegal99 at hotmail.com
Mon Nov 24 15:31:02 EST 2003
More information about the Python-list mailing list
Mon Nov 24 15:31:02 EST 2003
- Previous message (by thread): os.walk help
- Next message (by thread): os.walk help
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
This works great! No errors... and it gets dirs that are 8 levels deep (that's as far down as I've tested). Thanks for the tip! The re.sub seems to be much faster than the string find/replace approach as well... I need to read-up more on the documentation of os.walk and re in general. Thanks again!!! Robin Munn wrote: > Wait, I just realized that you're changing the list *while* you're > iterating over it. That's a bad idea. See the warning at the bottom of > this page in the language reference: > > http://www.python.org/doc/current/ref/for.html > > Instead of modifying the list while you're looping over it, use the > topdown argument to os.walk to build the tree from the bottom up instead > of from the top down. That way you won't have to futz with the dirnames > list at all: > > def clean_names(rootpath): > bad = re.compile(r'%2f|%25|%20|[*?<>/\|\\]') > for root, dirs, files in os.walk(rootpath, topdown=False): > for dname in dirs: > newdname = re.sub(bad, '-', dname) > if newdname != dname: > newpath = os.path.join(root, newdname) > oldpath = os.path.join(root, dname) > os.renames(oldpath, newpath) > > Notice also the use of re.sub to do all the character substitutions at > once. Your code as written would have failed on a filename like "foo*?", > since it always renamed from the original filename: it would have first > done os.renames("foo*?", "foo-?") followed by os.renames("foo*?", > "foo--") and the second would have raised an OSError. >
- Previous message (by thread): os.walk help
- Next message (by thread): os.walk help
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list