Geek Logbook

Tech sea log book

Handling shutil.SameFileError When Copying Files in Python

When using Python’s shutil.copy() or shutil.copy2() to copy files, you might run into a shutil.SameFileError if you mistakenly attempt to copy a file onto itself. This error occurs when the source and destination paths are the same, disrupting your script’s execution. In this post, we’ll explore how to prevent this error and ensure files are copied only when the source and destination are different.

The Problem

Trying to copy a file to the same location results in this error:

shutil.SameFileError: 'source_file' and 'destination_file' are the same file

This happens when the source and destination paths are identical, making the copy operation redundant.

The Solution

You can avoid this error by comparing the source and destination paths before copying the file. If they are the same, simply skip the copy operation. Here’s how you can implement it:

import os
import shutil

def safe_copy(src, dest):
    # Convert source and destination to absolute paths
    abs_src = os.path.abspath(src)
    abs_dest = os.path.abspath(dest)

    # Check if source and destination are the same
    if abs_src == abs_dest:
        print(f"Skipping copy: Source and destination are the same file: {abs_src}")
        return

    # Proceed to copy the file if they are different
    try:
        shutil.copy2(src, dest)
        print(f"Successfully copied {src} to {dest}")
    except shutil.SameFileError:
        print(f"Error: Source and destination are the same file. Copy skipped.")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

# Example usage
source_file = 'data/report.txt'
destination_file = 'backup/report.txt'

safe_copy(source_file, destination_file)

Explanation

  1. Absolute Path Comparison: To ensure accurate comparisons, both the source and destination paths are converted to absolute paths using os.path.abspath(). This avoids issues where relative paths might otherwise be seen as different when they’re actually the same.
  2. Skipping Identical Paths: Before copying, the function checks if the source and destination are identical. If they are, it prints a message and skips the operation.
  3. Error Handling: The function catches shutil.SameFileError specifically for same-file errors and handles any other exceptions to ensure the script runs smoothly.

Conclusion

By checking if the source and destination paths are identical before copying, you can avoid the shutil.SameFileError and streamline your file handling logic. This approach helps ensure files are only copied when necessary, enhancing the robustness of your Python file operations.