Batch Renaming of Files in a Directory Batch Renaming of Files in a Directory python python

Batch Renaming of Files in a Directory


I prefer writing small one liners for each replace I have to do instead of making a more generic and complex code. E.g.:

This replaces all underscores with hyphens in any non-hidden file in the current directory

import os[os.rename(f, f.replace('_', '-')) for f in os.listdir('.') if not f.startswith('.')]


Such renaming is quite easy, for example with os and glob modules:

import glob, osdef rename(dir, pattern, titlePattern):    for pathAndFilename in glob.iglob(os.path.join(dir, pattern)):        title, ext = os.path.splitext(os.path.basename(pathAndFilename))        os.rename(pathAndFilename,                   os.path.join(dir, titlePattern % title + ext))

You could then use it in your example like this:

rename(r'c:\temp\xx', r'*.doc', r'new(%s)')

The above example will convert all *.doc files in c:\temp\xx dir to new(%s).doc, where %s is the previous base name of the file (without extension).


If you don't mind using regular expressions, then this function would give you much power in renaming files:

import re, glob, osdef renamer(files, pattern, replacement):    for pathname in glob.glob(files):        basename= os.path.basename(pathname)        new_filename= re.sub(pattern, replacement, basename)        if new_filename != basename:            os.rename(              pathname,              os.path.join(os.path.dirname(pathname), new_filename))

So in your example, you could do (assuming it's the current directory where the files are):

renamer("*.doc", r"^(.*)\.doc$", r"new(\1).doc")

but you could also roll back to the initial filenames:

renamer("*.doc", r"^new\((.*)\)\.doc", r"\1.doc")

and more.