如何防止Python的os.walk跨越挂载点?

时间:2009-02-23 14:17:00

标签: python linux unix

在Unix中,所有磁盘都作为主文件系统中的路径公开,因此os.walk('/')将遍历,例如/media/cdrom以及主硬盘,这对某些应用程序来说是不可取的。 / p>

如何获得保留在单个设备上的os.walk

相关:

3 个答案:

答案 0 :(得分:15)

来自os.walk文档:

  

当topdown为true时,调用者可以   就地修改dirnames列表   (也许使用del或slice   赋值)和walk()只会   递归到其子目录中   姓名保留在名字中;这可以   用于修剪搜索

所以这样的事情应该有效:

for root, dirnames, filenames in os.walk(...):
  dirnames[:] = [
    dir for dir in dirnames
    if not os.path.ismount(os.path.join(root, dir))]
  ...

答案 1 :(得分:3)

我认为os.path.ismount可能适合您。您的代码可能如下所示:

import os
import os.path
for root, dirs, files in os.walk('/'):
    # Handle files.
    dirs[:] = filter(lambda dir: not os.path.ismount(os.path.join(root, dir)), 
                  dirs)

您可能还会发现this answer有助于构建解决方案。

*感谢您对正确过滤dirs的评论。

答案 2 :(得分:1)

os.walk()无法分辨(据我所知)它正在浏览不同的驱动器。你需要亲自检查一下。

尝试使用os.stat(),或检查os.walk()中的根变量是否为/media