Заменить команду в O.Rename

Можно ли переименовать os.rename для перезаписывания другого файла, если он уже существует? Например, в приведенном ниже коде, если файл Tests.csv уже существует, он будет заменен файлом Tests.txt(который также был переименован в Tests.csv).

os.rename("C:\Users\Test.txt","C:\Users\Tests.csv");

Ответ 1

Вы можете попробовать shutil.move():

from shutil import move

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

Или os.remove, а затем shutil.move:

from os import remove
from shutil import move

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

Ответ 2

Начиная с Python 3.3, теперь существует стандартное кросс-платформенное решение, os.replace:

Переименуйте файл или каталог src в dst. Если dst является каталогом, OSError будет поднял. Если dst существует и является файлом, он будет заменен молча, если у пользователя есть разрешение. Операция может завершиться неудачей, если src и dst включены различные файловые системы. В случае успеха переименование будет атомарным (это требование POSIX).

Доступность: Unix, Windows.

Новое в версии 3.3.

Однако, вопреки документации, в Windows он не гарантированно является атомарным (в Python 3.4.4). Это потому, что внутри использует MoveFileEx в Windows, что не дает такой гарантии.

Ответ 3

Поскольку документация говорит о невозможности гарантировать операцию атомного переименования в Windows, если файл существует, так что Python делает запрос на двойную шаг os.remove + os.rename самостоятельно, обрабатывая потенциальные ошибки.

В Unix-системах rename перезаписывает пункт назначения, если существует (потому что операция гарантирована как атомарная).

Обратите внимание, что в окнах также возможно, что удаление целевого файла завершится неудачно, даже если у вас есть разрешение, потому что файл может быть использован. Это еще одно существенное ограничение файловой системы Windows, и вы должны сами обрабатывать его в коде.

Ответ 4

В Unix, если dst существует и является файлом, он будет заменен молча, если у пользователя есть разрешение. Операция может завершиться неудачей при некоторых вариантах Unix, если src и dst находятся в разных файловых системах. В случае успеха переименование будет атомной операцией (это требование POSIX). В Windows, если dst уже существует, OSError будет поднят, даже если это файл; не может быть никакого способа реализовать атомное переименование, когда dst называет существующий файл. http://docs.python.org/library/os.html#os.rename

Ответ 5

Забавно, в документации для os.rename() говорится, что он заменяет цель на Unix-системах, но в Windows это не так. Они упоминают что-то неопределенное в том, что невозможно реализовать атомное переименование, если место назначения существует в Windows, что ИМО вряд ли является достаточной причиной, чтобы не поддерживать его.

Вы должны поймать OSError (назначение существует в Windows) и удалить место назначения и повторить попытку, я полагаю.

Ответ 6

В документации стандартной библиотеки "В Windows, если dst уже существует, OSError будет поднят, даже если это файл, не может быть никакого способа реализовать атомное переименование, когда dst именет существующий файл".

http://docs.python.org/library/os.html#os.rename

Таким образом, единственным решением, к сожалению, было бы изменение операционных систем; Windows просто запрещает rename() поверх существующего файла.