Скажем, у меня есть входной файл и целевой каталог. Как определить, находится ли входной файл на том же жестком диске (или разделе), что и целевой каталог?
Что я хочу сделать, так это скопировать файл, если он находится в другом, но переместить его, если он такой же. Например:
target_directory = "/Volumes/externalDrive/something/"
input_foldername, input_filename = os.path.split(input_file)
if same_partition(input_foldername, target_directory):
copy(input_file, target_directory)
else:
move(input_file, target_directory)






В C вы должны использовать stat() и сравнить поле st_dev. В python os.stat должен делать то же самое.
import os
def same_partition(f1, f2):
return os.stat(f1).st_dev == os.stat(f2).st_dev
Другой способ - это подход «лучше просить прощения, чем разрешения» - просто попробуйте переименовать его, а если это не удастся, поймайте соответствующий 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.
Обратите внимание, что это не будет работать в Windows, поэтому st_dev остается равным 0 для всех дисков. (Вероятно, это не проблема для спрашивающего, поскольку он указывает теги osX и linux)