如何确定文件是否在Python中是远程的

时间:2012-07-25 11:35:54

标签: python

我想确定文件是否位于本地硬盘驱动器或OSX中从网络安装的驱动器上。所以我想要生成类似下面的代码:

file_name = '/Somewhere/foo.bar'
if is_local_file(file_name):
    do_local_thing()
else:
    do_remote_thing()

我在上面的示例中找不到像is_local_file()这样的任何内容。理想情况下,我想使用现有的功能,如果有的话,但是我怎么能自己实现呢?我提出的最好的是以下,但这对待已安装的dmgs就好像它们是远程的,这不是我想要的。另外我怀疑我可能会重新发明轮子!

def is_local_file(path):
    path = path.split('/')[1:]
    for index in range(1,len(path)+1):
        if os.path.ismount('/' + '/'.join(path[:index])):
            return False
    return True

我有两个生成校验和的函数,其中一个函数使用多进程,这会产生开销,但如果网络连接速度慢,则对于大文件来说速度更快。

2 个答案:

答案 0 :(得分:2)

“我有两个生成校验和的函数,其中一个函数使用多进程,这会导致开始时的开销,但如果网络连接速度慢,则对于大文件来说速度更快。”

那么你真正想要的is_local_file()告诉你的只是“文件访问权限会比我想要的慢吗?”的代理措施。作为一种代理措施,对于上面提到的所有混淆原因(本地但虚拟化的磁盘,远程但速度惊人的NAS等),你真正想知道的是一个相对较差的指标。

由于您提出的问题几乎不可能以编程方式回答,因此最好提供一个选项,就像-jobs上的make选项明确表示“并行化此运行”一样。

答案 1 :(得分:1)

您可以使用现有代码(或尝试How to find the mountpoint a file resides on?处的解决方案)来查找文件的挂载点;然后阅读/proc/mounts以找到设备和文件系统; /proc/mounts具有格式

device mountpoint filesystem options...

您可以使用filesystem字段自动排除已知的网络文件系统,例如afs,cifs,nfs,smbfs。否则你可以看看设备;作为基本启发式,如果设备是设备节点(stat.S_ISBLK)或none,那么文件系统可能是本地的;如果它是URI样式(host:/path)那么它可能是远程的;如果是实际文件,则文件系统是磁盘映像,您需要递归。