说我有一个输入文件和一个目标目录。如何确定输入文件是否与目标目录位于同一硬盘驱动器(或分区)上?
我想做的是,如果文件位于其他位置,则将其复制,但如果文件相同,则将其移动。例如:
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已经可以完成您想要的操作:
功能在模块关闭时的帮助:移动(src,dst)将文件或目录递归移动到另一个位置。如果目标位于我们当前的文件系统上,则只需使用改名。否则,将src复制到dst,然后删除src。
[[编辑]”由于Matthew Schinckel的评论而更新,其中提到shutil.move将在复制后删除源,这不一定是所需要的,因为问题仅涉及复制。