Как определить, находится ли каталог в том же разделе

Скажем, у меня есть входной файл и целевой каталог. Как определить, находится ли входной файл на том же жестком диске (или разделе), что и целевой каталог?

Что я хочу сделать, так это скопировать файл, если он находится в другом, но переместить его, если он такой же. Например:

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)
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
6
0
1 420
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В 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

Обратите внимание, что это не будет работать в Windows, поэтому st_dev остается равным 0 для всех дисков. (Вероятно, это не проблема для спрашивающего, поскольку он указывает теги osX и linux)

Brian 30.10.2008 20:09

Другой способ - это подход «лучше просить прощения, чем разрешения» - просто попробуйте переименовать его, а если это не удастся, поймайте соответствующий 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.

Другие вопросы по теме