排除 os.walk 中的目录
- 2025-02-24 09:29:00
- admin 原创
- 75
问题描述:
我正在编写一个脚本,该脚本会深入目录树(使用 os.walk()),然后访问与特定文件扩展名匹配的每个文件。但是,由于我的工具将要使用的某些目录树还包含子目录,而这些子目录又包含大量无用的东西(对于此脚本的目的而言),因此我认为我应该为用户添加一个选项,以指定要从遍历中排除的目录列表。
使用 os.walk() 很容易做到这一点。毕竟,我是否真的想访问 os.walk() 产生的相应文件/目录或只是跳过它们取决于我自己。问题是,如果我有这样的目录树:
root--
|
--- dirA
|
--- dirB
|
--- uselessStuff --
|
--- moreJunk
|
--- yetMoreJunk
并且我想排除uselessStuff及其所有子目录,os.walk() 仍将深入到uselessStuff的所有子目录(可能数千个),这无疑会大大降低速度。在理想情况下,我可以告诉 os.walk() 甚至不要再产生uselessStuff的任何子目录,但据我所知,没有办法做到这一点(有吗?)。
有人有想法吗?也许有第三方库提供类似的东西?
解决方案 1:
dirs
就地修改将修剪访问的(后续)文件和目录os.walk
:
# exclude = set(['New folder', 'Windows', 'Desktop'])
for root, dirs, files in os.walk(top, topdown=True):
dirs[:] = [d for d in dirs if d not in exclude]
来自帮助(os.walk):
当 topdown 为真时,调用者可以就地修改 dirnames 列表(例如,通过 del 或切片分配),并且 walk 将仅递归到名称保留在 dirnames 中的子目录中;这可用于修剪搜索......
解决方案 2:
...@unutbu 的优秀答案的另一种形式,读起来更直接一些,因为其目的是排除目录,代价是 O(n**2) 与 O(n) 时间。
list(dirs)
(为了正确执行,需要复制目录列表)
# exclude = set([...])
for root, dirs, files in os.walk(top, topdown=True):
[dirs.remove(d) for d in list(dirs) if d in exclude]
相关推荐
热门文章
项目管理软件有哪些?
热门标签
曾咪二维码
扫码咨询,免费领取项目管理大礼包!
云禅道AD