文件存在性测试:Python中的快速子树搜索

2 投票
2 回答
780 浏览
提问于 2025-04-18 13:15

我需要检查一个文件在某个文件夹及其所有子文件夹中是否存在。

因为这个检查在程序运行时需要做很多次,所以我想找一个快速的方法来完成这个任务。

我知道可以使用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

撰写回答