How to Use shutil.move() on Windows and Linux
Today when I try to move a file using
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
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
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.
License CC BY-NC-ND 4.0