Using Python to create directories and move files

Today I needed to move 435 TIFF images from the San Marcos Daily Record Negative Collection into folders based on a section of their filename.

The filenames include the following sections: SMDR_1959-185_001.tif

  1. SMDR, the collection code for the items digitized
  2. 1959, the year the negatives are from
  3. 185, the physical folder the negatives are from
  4. 001, the index number for the image
  5. tif, the file’s extension

If there is more than 1 negative in folder 185, then the 2nd image will get index number 002, i.e. SMDR_1959-185_002.tif.

Example of TIFF filenames

Some of the TIFF images that needed to be sorted into folders

We organize the images in digital folders to match the physical folders, so every image in the SMDR collection from 1959 in physical folder 185 needs to be in a digital folder 185. The folder therefore only needs sections 1-3 of the filename, i.e. SMDR_1959-185.

I have the images and I know what my digital folder names need to be, but if I did all of this work by hand it would not only take a significant amount of time, I would probably make a few mistakes. This type of repetitive work is better handled by the computer because it will not only create the folders and move the files more quickly, it is much less likely to make mistakes (assuming I provide the proper instructions).

This was very quickly done in Python 3.6 on Windows 10 using less than 20 lines of code:

import os
import shutil

dir = "1959_6x6/"

for file in os.listdir(dir):
    # get all but the last 8 characters to remove
    # the index number and extension
    dir_name = file[-8]
    print(f'dir_name: {dir_name}')

    dir_path = dir + dir_name
    print(f'dir_path: {dir_path}')
    
    # check if directory exists or not yet
    if not os.path.exists(dir_path):
        os.makedirs(dir_path)

    if os.path.exists(dir_path):
        file_path = dir + file
        print(f'file_path: {file_path}')
        
        # move files into created directory
        shutil.move(file_path, dir_path)

This code doesn’t use best practices as I should be creating the directory path differently, but hey, it worked and I was able to create the directories, move the files, and write this blog post in significantly less time than it would have taken to do it manually.

Jeremy Moore

jeremy.moore@txstate.edu