【问题标题】:How do I prevent Python's os.walk from walking across mount points?如何防止 Python 的 os.walk 穿过挂载点?
【发布时间】:2010-10-09 07:56:29
【问题描述】:

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

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

相关:

【问题讨论】:

标签: python linux unix


【解决方案1】:

os.walk() 无法判断(据我所知)它正在浏览不同的驱动器。您需要自己检查。

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

【讨论】:

    【解决方案2】:

    我认为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 有助于构建您的解决方案。

    *感谢 cmets 正确过滤 dirs

    【讨论】:

    • 您可以通过将代码更改为“dirs[:] = filter(...)” 来解决,就地改变列表而不是重新分配
    【解决方案3】:

    来自os.walk docs:

    当 topdown 为真时,调用者可以 就地修改目录名列表 (也许使用 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))]
      ...
    

    【讨论】:

    • 一个非常简洁的答案。
    猜你喜欢
    • 2022-09-23
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多