os.walk 第一次找到后停止查找子目录
os.walk stop looking on subdirectories after first finding
我需要获取目录中 repository.config 文件的首次出现,并停止在子目录中查找。
这是我的目录树:
./WAS80/base/disk1/ad/repository.config
./WAS80/base/disk1/md/repository.config
./WAS80/base/disk2/ad/repository.config
./WAS80/base/disk3/ad/repository.config
./WAS80/base/disk4/ad/repository.config
./WAS80/base/repository.config
./WAS80/fixpack/fp5/repository.config
./WAS80/fixpack_suplements/fp5/repository.config
./WAS80/supplements/disk1/ad/repository.config
./WAS80/supplements/disk1/md/repository.config
./WAS80/supplements/disk2/ad/repository.config
./WAS80/supplements/disk3/ad/repository.config
./WAS80/supplements/disk4/ad/repository.config
./WAS80/supplements/repository.config
我需要加粗的那些,不要在子目录中查找了。
我开始修改这段代码,但我想不通。
pattern='repository.config'
path='/opt/was_binaries'
def find_all(name, path):
result = []
for root, dirs, files in os.walk(path):
if name in files:
result.append(os.path.join(root, name))
continue
return result
这应该可以满足您的要求:
import os
res = []
for here, dirs, files in os.walk(startdir, topdown=True):
if 'repository.config' in files:
res.append(os.path.join(here, 'repository.config'))
dirs[:] = []
print(res)
每当遇到 'repository.config'
文件时,将 dirs
设置为 []
以防止 os.walk
进一步下降到该目录树中。
注意:重要的是就地更改 dirs
(即 dirs[:] = []
)而不是重新绑定它(dirs = []
)。,
首先,您必须确保 topdown
设置为 True
(这是默认设置),以便在 扫描子目录之前 扫描父目录。
创建一个 existing
set()
以记住您在成功找到配置文件时遍历了哪些目录。
然后,当您在列表中找到您的文件名时:
- 检查文件目录是否不是您注册目录的子目录
- 如果不是,只需记下
existing
中的文件路径(添加os.sep
,这样就不会在同一级别匹配以当前目录名开头的目录的子字符串:例如:即使 path\to\dir
已经在 set
中,也应该扫描 path\to\dir2
。但是 path\to\dir\subdir
将被成功过滤掉)。
代码:
import os
existing = set()
for root,dirs,files in os.walk(path,topdown=True):
if any(root.startswith(r) for r in existing):
# current directory is longest and contains a previously added directory: skip
continue
if "repository.config" in files:
# ok, we note down root dir (+ os.sep to avoid filtering siblings) and print the result
existing.add(root+os.sep)
print(os.path.join(root,"repository.config"))
我需要获取目录中 repository.config 文件的首次出现,并停止在子目录中查找。
这是我的目录树:
./WAS80/base/disk1/ad/repository.config ./WAS80/base/disk1/md/repository.config ./WAS80/base/disk2/ad/repository.config ./WAS80/base/disk3/ad/repository.config ./WAS80/base/disk4/ad/repository.config ./WAS80/base/repository.config ./WAS80/fixpack/fp5/repository.config ./WAS80/fixpack_suplements/fp5/repository.config ./WAS80/supplements/disk1/ad/repository.config ./WAS80/supplements/disk1/md/repository.config ./WAS80/supplements/disk2/ad/repository.config ./WAS80/supplements/disk3/ad/repository.config ./WAS80/supplements/disk4/ad/repository.config ./WAS80/supplements/repository.config
我需要加粗的那些,不要在子目录中查找了。
我开始修改这段代码,但我想不通。
pattern='repository.config'
path='/opt/was_binaries'
def find_all(name, path):
result = []
for root, dirs, files in os.walk(path):
if name in files:
result.append(os.path.join(root, name))
continue
return result
这应该可以满足您的要求:
import os
res = []
for here, dirs, files in os.walk(startdir, topdown=True):
if 'repository.config' in files:
res.append(os.path.join(here, 'repository.config'))
dirs[:] = []
print(res)
每当遇到 'repository.config'
文件时,将 dirs
设置为 []
以防止 os.walk
进一步下降到该目录树中。
注意:重要的是就地更改 dirs
(即 dirs[:] = []
)而不是重新绑定它(dirs = []
)。,
首先,您必须确保 topdown
设置为 True
(这是默认设置),以便在 扫描子目录之前 扫描父目录。
创建一个 existing
set()
以记住您在成功找到配置文件时遍历了哪些目录。
然后,当您在列表中找到您的文件名时:
- 检查文件目录是否不是您注册目录的子目录
- 如果不是,只需记下
existing
中的文件路径(添加os.sep
,这样就不会在同一级别匹配以当前目录名开头的目录的子字符串:例如:即使path\to\dir
已经在set
中,也应该扫描path\to\dir2
。但是path\to\dir\subdir
将被成功过滤掉)。
代码:
import os
existing = set()
for root,dirs,files in os.walk(path,topdown=True):
if any(root.startswith(r) for r in existing):
# current directory is longest and contains a previously added directory: skip
continue
if "repository.config" in files:
# ok, we note down root dir (+ os.sep to avoid filtering siblings) and print the result
existing.add(root+os.sep)
print(os.path.join(root,"repository.config"))