假设我有一个输入文件和一个目标目录。如何确定输入文件是否与目标目录位于同一硬盘驱动器(或分区)上?
我想要做的是复制一个文件,如果它是不同的,但如果它是相同的,则移动它。例如:
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)
感谢CesarB的回答,实现了same_partition
功能:
import os
def same_partition(f1, f2):
return os.stat(f1).st_dev == os.stat(f2).st_dev
答案 0 :(得分:11)
在C中,您将使用stat()
并比较st_dev
字段。在python中,os.stat
也应该这样做。
答案 1 :(得分:3)
另一种方式是“更好地请求宽恕而非许可”方法 - 只是尝试重命名它,如果失败,请抓住相应的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.
[编辑]更新由于Matthew Schinckel的评论提到shutil.move将在复制后删除源,这不一定是想要的,因为问题只是提到复制。