Renaming files in Dropbox using Python and Dropbox API

Recently, I came across an interesting project involving Dropbox. The client manages a services business where they take hundreds of images per project and upload them to Dropbox. Then they have to re-upload the images to their internal system for which the images where required to be renamed following certain patterns.

The Problem: How to rename thousands of files in Dropbox folders?

Renaming thousands of files on Dropbox manually is a pain, especially when the files have to be renamed based on certain patterns.

I was asked to write an app that will:

  1. Connect with Dropbox
  2. Ask for a folder and make sure it exists
  3. Scan the folder for image files. In most cases the images will be stored in Zip archives which have to decompressed. Since Dropbox does not allow decompression of zip files, such files have to downloaded, unzipped and uploaded again.
  4. Rename files that match certain pattern

The Solution: A Python script to rename files using Dropbox API

I decided to write a Python script that will connect to Dropbox API using Python SDK and rename the files based on the requirements.

In order to work with Dropbox API, it is required to create a Dropbox App and generate the access token.

Create a Dropbox App and get Access Token:

create dropbox app

  • Visit the Dropbox App Console. https://www.dropbox.com/developers/apps/
  • Click the Create app button.
  • From Choose an API section select Dropbox API.
  • From Choose the type of access you need section select Full Dropbox.
  • Enter a name for your app, — << I have selected say ImageRenamer >>
  • Click on Create app button.
  • On the next screen, click on Generate to generate access token.
    An access token will be generated.

Install Dropbox SDK and brew some Python magic

Install Dropbox Python SDK:

    pip install dropbox

Import modules:

    import dropbox
    import os
    import zipfile

Code to rename files in using Python SDK and Dropbox API:

    # input name of image folder
    image_folder = str(input("Enter folder name to fetch images: ")).lower()

    # instantiate Dropbox connection
    dbx = dropbox.Dropbox('dropbox access token')

    # proceed if image folder exists in Dropbox
    if dbx.files_get_metadata(image_folder).path_lower == image_folder:
         
        # iterate through the files inside Dropbox folder
        for file in dbx.files_list_folder(image_folder).entries:
    
            # if zip files found, download, unzip and upload
            if file.name.endswith(".zip"):

                # download zip file and save locally                
                with open("downloaded_zip.zip", "wb") as f:
                    metadata, res = dbx.files_download(file.path_lower)
                    f.write(res.content) 

                # extract zip file using Python zipfile module
                # folder name "image_folder" is same as on Dropbox
                with zipfile.ZipFile("downloaded_zip.zip", "r") as zip_ref:
                    zip_ref.extractall(image_folder)

                # upload extracted images to Dropbox
                for root, dirs, files in os.walk(images_folder, topdown=False):
                        for name in files:
                            file_to_upload = os.path.join(root, name)

                            # create upload path and replace \ with / :: a work around from windows to linux
                            file_upload_path = dropbox_folder + file_to_upload.replace(os.path.sep, '/')[3:]

                            with open(file_to_upload, "rb") as f:
                                dbx.files_upload(f.read(), file_upload_path, mute=True)

        # rename images files in Dropbox folder and sub-folders         
        for entry in dbx.files_list_folder(image_folder, recursive=True, include_deleted=False).entries:
            # files_move_v2 will move file from source to destination path
            # if both paths are same, the file will be essentially renamed.
            dbx.files_move_v2(entry.path_display, new_file_path)

** Above code is proof of concept. It does not cover catching exceptions and applying business logic.

Finally the code was packaged in an .exe executable using PyInstaller. Running the application will give a set of options to perform actions accordingly.

dropbox image renamer exe

Resources:

Creating a Dropbox app [link]

Signup for a free Dropbox account [link]

Python Dropbox SDK GitHub [link]

Python Dropbox SDK documentation [link]


  

Leave a Comment