Skip to content

Instantly share code, notes, and snippets.

@kblum
Created September 5, 2018 21:33
Show Gist options
  • Save kblum/0c5fcde7f9bfad75c074cbf4c6a47211 to your computer and use it in GitHub Desktop.
Save kblum/0c5fcde7f9bfad75c074cbf4c6a47211 to your computer and use it in GitHub Desktop.
Rename PDF magazine issues from MAGatHOME
#!/usr/bin/python
import logging
import argparse
import os
import re
import calendar
def transform_name(fn):
# filename format: [TITLE]_[MONTH_NAME]_[YEAR].pdf
regex = re.compile(r'(.*?)_(.*?)_(\d*)', re.I)
# mapping for month name to month number
month_lookup = dict((v,k) for k,v in enumerate(calendar.month_name))
extension = 'pdf'
match = regex.match(fn)
if not match:
return None
groups = match.groups()
if not groups or len(groups) != 3:
return None
(title, month_name, year) = groups
month_number = month_lookup[month_name]
return "{title} {year}-{month_number:02d} - {month_name} {year}.{extension}".format(title=title, year=year, month_number=month_number, month_name=month_name, extension=extension)
def rename(old_name, new_name, dry_run=False):
logging.info("Renaming '{old_name}' to '{new_name}'".format(old_name=old_name, new_name=new_name))
if dry_run:
logging.debug("Dry run; not performing rename")
return
os.rename(old_name, new_name)
logging.debug("File renamed")
def main(dir_path, dry_run):
if dry_run:
logging.info("[DRY RUN] Processing directory: %s", dir_path)
else:
logging.info("Processing directory: %s", dir_path)
# list of filenames for file contents of directory
files = [f for f in os.listdir(dir_path) if os.path.isfile(os.path.join(dir_path, f))]
for fn in files:
name = transform_name(fn)
if not name:
logging.warn("Skipping; unable to transform name for %s", fn)
continue
rename(os.path.join(dir_path, fn), os.path.join(dir_path, name), dry_run)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("dir_path")
parser.add_argument("--verbose", help="increase logging verbosity", action="store_true")
parser.add_argument("--dry-run", help="dry run; do not rename files", action="store_true")
args = parser.parse_args()
log_level = logging.DEBUG if args.verbose else logging.INFO
logging.basicConfig(level=log_level)
dir_path = os.path.realpath(args.dir_path)
dry_run = args.dry_run
main(dir_path, dry_run)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment