Другим способом является подход «лучше просить прощения, чем разрешения» - просто попробуйте переименовать его, а в случае неудачи перехватите соответствующий OSError
и попробуйте метод копирования. то есть:
import errno
try:
os.rename(source, dest):
except IOError, ex:
if ex.errno == errno.EXDEV:
# perform the copy instead.
Это имеет то преимущество, что оно также будет работать в Windows, где st_dev всегда равно 0 для всех разделов.
Обратите внимание, что если вы действительно хотите скопировать, а затем удалить исходный файл (т.е. выполнить перемещение), а не просто скопировать, то shutil.move уже сделает то, что вы хотите:
Help on function move in module shutil:
move(src, dst)
Recursively move a file or directory to another location.
If the destination is on our current filesystem, then simply use
rename. Otherwise, copy src to the dst and then remove src.
[Редактировать] В связи с комментарием Мэтью Шинкеля обновлено упоминание о том, что shutil.move удалит источник после копии, что не обязательно является желаемым, поскольку в вопросе упоминается только копирование.