Skip to main content
  1. Posts/

How to Use shutil.move() on Windows and Linux

··331 words·2 mins·
Note Windows CentOS Python
Table of Contents

Today when I try to move a file using shutil.move() on my Windows machine, I encounter an error message:

PermissionError: [WinError 32] The process cannot access the file because it is being used by another process

In this post, I will write about what I have learned from this error.

How to move files correctly on Windows
#

On Windows, before moving a file, you must close it. Or, you will see the above error message.

Suppose that we want to move images in a child directory images/ to another child directory small_image/ if the width of an image is below a threshold. On Windows system, the correct way to do it is like the following:

from glob import glob
from PIL import Image

all_images = glob("images/*.jpg")

for i, im_path in enumerate(all_images):
    im = Image.open(im_path)
    width = im.width
    # we must close the image before moving it to another directory
    im.close()

    if width < 15:
        shutil.move(im_path, 'small_images/')

On Linux, you are not required to close the file before moving it, i.e., you can move a file even if it is opened by another process.

How to move a file if a file with the same name already exists in the destination directory?
#

On both Linux and Windows, when you try to move a file using shutil.move(src, dst) with dst set as a directory path, you will encounter the following error message if a file with the same name already exists under dst:

shutil.Error: Destination path ‘./test.txt’ already exists

The solution is to use the full file path in dst, i.e., a complete path to the new file. If a file with the same name exists under the destination folder, it will be silently replaced. If that behaviour is not what you want, you may consider renaming the file under the new directory.

References
#

Related

Display Image with Pillow inside Ubuntu on Windows
··268 words·2 mins
Note PIL Windows Python X11 WSL Ubuntu
Deoplete Failed to Load at Startup after Updating Python neovim Package
··473 words·3 mins
Note Nvim Windows CentOS
What Is The Difference between pip, pip3 and pip3.6 Shipped with Anaconda3?
··222 words·2 mins
Note Windows Anaconda Python Pip