Заменить команду в 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()
поверх существующего файла.