Created
September 5, 2018 21:33
-
-
Save kblum/0c5fcde7f9bfad75c074cbf4c6a47211 to your computer and use it in GitHub Desktop.
Rename PDF magazine issues from MAGatHOME
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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