文件存在性测试:Python中的快速子树搜索
我需要检查一个文件在某个文件夹及其所有子文件夹中是否存在。
因为这个检查在程序运行时需要做很多次,所以我想找一个快速的方法来完成这个任务。
我知道可以使用os.walk()这个函数,但我觉得它每次都会遍历整个文件夹树。由于我只是想用它来检查文件是否存在,有没有办法在os.walk找到我想要的文件后立即停止?
2 个回答
0
你可以简单地用break
来跳出循环。
不过,如果文件系统是静态的或者几乎不变,那么提前建立一个字典可能是更好的选择。
filename -> list of paths where it is
如果文件系统不是静态的,你可以开启一个新的线程,在这个线程里计算一个新的文件映射,而主线程则可以用这个映射来回答问题。
毕竟,问题“这个文件存在吗?”其实是个模糊的问题,它真正的意思是“在我问的时候,这个文件是否在列表中?”因为无论是找到了还是没找到,情况都可能会立刻改变(甚至在答案还没传回给提问者之前)。比如说,有人问一个文件是否存在,得到了存在的答案和位置,但在尝试打开这个文件时却出错,因为这个文件已经不存在了。
使用特定操作系统的扩展功能也是可能的,你可以安装一个“监视器”,它会被通知每次文件的创建或删除,这样就能保持文件映射的更新,而不需要不断地重新扫描整个文件树。
2
你觉得用一下break
语句怎么样?
比如说:
for p, ds, fs in os.walk(directory):
if 'wanted' in fs:
print('found in %s' % p)
break