file_name_fixer.py
Fredrik Lundh
fredrik at pythonware.com
Wed Jan 25 03:44:07 EST 2006
Steven D'Aprano wrote:
> You should consider factoring out some repeated code
> into functions. E.g.:
>
> # warning: untested!!!
> def replace_all(s, old, new):
> """Replaces all instances of substring old with
> substring new."""
> if old == new:
> # make no changes
> return s
> elif old in new:
> raise ValueError("old substring can't be "
> "part of the replacement substring.")
> while old in s:
> s = s.replace(old, new)
> return s
>
> Now you can call it in your loop:
>
> > for path, subdirs, files in os.walk(dir, topdown=True):
> > oldname = path
> > newname = oldname.translate(chars)
> > newname = string.lower(newname)
>
> > while string.count(newname, "__") > 0:
> > newname = string.replace(newname,"__","_")
> > while string.count(newname, "..") > 0:
> > newname = string.replace(newname,"..",".")
>
> becomes:
>
> newname = replace_all(newname, "__", "_")
> newname = replace_all(newname, "..", ".")
or you can use a more well-suited function:
# replace runs of _ and . with a single character
newname = re.sub("_+", "_", newname)
newname = re.sub("\.+", ".", newname)
or, slightly more obscure:
newname = re.sub("([_.])\\1+", "\\1", newname)
</F>
More information about the Python-list
mailing list