不深入目录的 os.walk
我该怎么做才能让 os.walk
只返回我提供的目录里的文件呢?
def _dir_list(self, dir_name, whitelist):
outputList = []
for root, dirs, files in os.walk(dir_name):
for f in files:
if os.path.splitext(f)[1] in whitelist:
outputList.append(os.path.join(root, f))
else:
self._email_to_("ignore")
return outputList
21 个回答
70
我觉得这个问题的解决办法其实很简单。
可以使用
break
只执行一次for循环的第一轮,肯定还有更优雅的方法。
for root, dirs, files in os.walk(dir_name):
for f in files:
...
...
break
...
第一次调用os.walk时,它会返回当前目录的元组,然后在下一次循环时返回下一个目录的内容。
拿原来的脚本,只需要加一个break。
def _dir_list(self, dir_name, whitelist):
outputList = []
for root, dirs, files in os.walk(dir_name):
for f in files:
if os.path.splitext(f)[1] in whitelist:
outputList.append(os.path.join(root, f))
else:
self._email_to_("ignore")
break
return outputList
244
不要使用 os.walk。
举个例子:
import os
root = "C:\\"
for item in os.listdir(root):
if os.path.isfile(os.path.join(root, item)):
print item
121
使用 walklevel
函数。
import os
def walklevel(some_dir, level=1):
some_dir = some_dir.rstrip(os.path.sep)
assert os.path.isdir(some_dir)
num_sep = some_dir.count(os.path.sep)
for root, dirs, files in os.walk(some_dir):
yield root, dirs, files
num_sep_this = root.count(os.path.sep)
if num_sep + level <= num_sep_this:
del dirs[:]
它的工作方式和 os.walk
一样,不过你可以给它传一个 level
参数,这个参数可以告诉它递归会深入到多深的层级。