Force Overwrite in Os.Rename

Since Python 3.3, there is now a standard cross-platform solution, os.replace:

Rename the file or directory src to dst. If dst is a directory, OSError will be raised. If dst exists and is a file, it will be replaced silently if the user has permission. The operation may fail if src and dst are on different filesystems. If successful, the renaming will be an atomic operation (this is a POSIX requirement).

Availability: Unix, Windows.

New in version 3.3.

However, contrary to the documentation, on Windows it's not guaranteed to be atomic (in Python 3.4.4). That's because internally it uses MoveFileEx on Windows, which doesn't make such a guarantee.


You could try shutil.move():

from shutil import move

move('C:\\Users\\Test.txt', 'C:\\Users\\Tests.csv')

Or os.remove and then shutil.move:

from os import remove
from shutil import move

remove('C:\\Users\\Tests.csv')
move('C:\\Users\\Test.txt', 'C:\\Users\\Tests.csv')

As the documentation says it's impossible to guarantee an atomic renaming operation on Windows if the file exists so what Python does is asking to do the double step os.remove + os.rename yourself, handling potential errors.

On unix systems rename overwrites the destination if exists (because the operation is guaranteed to be atomic).

Note that on windows it's also possible that deleting the destination file will fail even if you have permission because the file may be in use. This is another essential limitation of the windows file system and you have to handle it yourself in the code.