Source code for pyutil.batch_renamer

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Renames a directory of files based on a template.

.. module:: batch_renamer.py

First we'll examine the contents of a directory and ensure it only contains
files with names we want to rename.


.. code-block:: python3

    >>> os.listdir("/path/to/dir")
    ['img_1074.jpg', 'img_1076.jpg', 'img_1077.jpg']


As we can see it does we'll then invoke the script like so.

.. code-block:: shell-session

    python3 batch_renamer.py /path/to/dir
    img_1074.jpg --> Ashley_0.jpg
    img_1076.jpg --> Ashley_1.jpg
    img_1077.jpg --> Ashley_2.jpg

"""
import argparse
import os
import logging
from pathlib import Path
# import shutil
from string import Template

from .__about__ import __version__

LOG_LEVEL = "logging.WARNING"


[docs]class BatchRename(Template): """Delimiter for string substitutions.""" delimiter = '%'
[docs]def _parse_arguments(): """Parse user arguments.""" parser = argparse.ArgumentParser(description=__doc__) # should add in either globbing or fnmatch capabilities parser.add_argument( "-d", "--directory", nargs=1, default=Path.cwd(), help="Directory containing only the files to be renamed.") parser.add_argument('old_format', nargs=1, metavar='old_format', help=r'Enter old format to replace.') parser.add_argument( 'rename_format', nargs=1, metavar='rename_format', help= r'Enter rename style (%d-date %n-seqnum %f-format I.E. Ashley_%n%f)') parser.add_argument( '-ll', '--log_level', dest='log_level', metavar='log level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], help='Set the logging level') parser.add_argument('-V', '--version', action='version', version='%(prog)s' + __version__) args = parser.parse_args() return args
[docs]def batch_mover(pattern, new_pattern, directory=None): """Move files in the current working directory that match a pattern. Parameters ---------- pattern : str Pattern to check filenames for. Functionally would be the old extension. new_pattern : str What to replace the old pattern with. directory : str, optional Directory where files that need to be renamed can be found. Returns ------- Bool """ if directory is None: directory = Path().cwd() for i in os.scandir(directory): if file_check(pattern, i.name): pass
# shutil.move(i.name, yeah we gotta change a lot here
[docs]def file_check(pattern, file_to_check): """Check that the file exists and matched the desired pattern.""" if file_to_check.name.__contains__(pattern): yield True
[docs]def main(): """Execute module.""" args = _parse_arguments() d = args.directory fmt = args.rename_format old = args.old_pattern try: log_level = args.log_level except Exception: # IndexError? logging.basicConfig(level=LOG_LEVEL) else: logging.basicConfig(level=log_level) logging.debug("The directory that was chosen was: " + str(d)) batch_mover(pattern=old, new_pattern=fmt, directory=d)
if __name__ == '__main__': main()