Python Walker, который не идет в определенные папки
Это мой первый пост, так что будьте нежнее.;)
ПРОБЛЕМА. Я хотел бы иметь возможность использовать os.walk как средство просмотра каталогов, но не использовать определенные папки. Пример:
Дерево:
\Proj1_0
\Load001
\lib
\src
\Proj2_0
\Load001
\lib
\src
\Load002
\lib
\src
Я хочу показать проекты и загрузки, но не подкаталоги под нагрузками. Я могу сделать это, используя следующий код.
import os
for root, subFolders, files in os.walk('.'):
# root does NOT contain 'Load'
if root.find('Load') == -1:
print "\nPROJECT: " + root + "\n"
for folder in subFolders:
print " " + folder
Тем не менее, список - это большой список, поэтому я попытался использовать del to, но не смог заставить его работать правильно, и то же самое, используя списки, такие как (который я получил из другого поста здесь):
def my_walk(top_dir, ignore):
for dirpath, dirnames, filenames in os.walk(top_dir):
dirnames[:] = [
dn for dn in dirnames
if os.path.join(dirpath, dn) not in ignore]
yield dirpath, dirnames, filename
list my_walk('.','Load')
Но я не мог заставить возвращение работать должным образом. Я новичок в Python и ценю любую помощь. Спасибо!
3 ответа
Вы можете попробовать следующее:
for x in os.walk('.', topdown=True):
dirpath, dirnames, dirfiles = x
print(dirpath, dirnames)
dirnames[:] = filter(lambda x : not x.startswith('Load'), dirnames)
От help(os.walk)
Вы можете изменить names
если topdown
является True
, чтобы ограничить поиск.
Пытаться:
dirnames[:] = [
dn for dn in dirnames
if ignore not in os.path.join(dirpath, dn)]
Вы хотите хранить каталоги, где os.path.join(dirpath, dn)
не содержит строку ignore
,
Кстати, вы вправе использовать dirnames[:]
на левой стороне задания. Чтобы удалить каталоги, которые посетили os.walk
, вы должны изменить тот же список dirnames
,
dirnames[:] = ...
изменяет тот же список на месте.dirnames = ...
перенаправил бы имя dirnames
к другому значению.
Кстати, это то, что я закончил с...
import os,string
path = '.'
path = os.path.normpath(path)
res = []
for root,dirs,files in os.walk(path, topdown=True):
depth = root[len(path) + len(os.path.sep):].count(os.path.sep)
if depth == 2:
# We're currently two directories in, so all subdirs have depth 3
res += [os.path.join(root, d) for d in dirs]
dirs[:] = [] # Don't recurse any deeper
print(res)
Я знаю, что это старый пост, но подумал, что должен обновить его своим ответом. В случае, если кто-то еще находит это полезным.