ОС.ходите не копаясь в каталогах ниже
Как мне ограничить 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
15 ответов:
Не используйте ОС.ходить.
пример:
import os root = "C:\" for item in os.listdir(root): if os.path.isfile(os.path.join(root, item)): print item
Я думаю, что решение на самом деле очень просто.
использовать
breakчтобы сделать только первую итерацию цикла for, должен быть более элегантный способ.
for root, dirs, files in os.walk(dir_name): for f in files: ... ... break ...при первом вызове ОС.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") break return outputList
предложение использовать
listdir- Это хорошо. Прямой ответ на ваш вопросroot, dirs, files = os.walk(dir_name).next()
Если у вас есть более сложные требования, чем просто верхний каталог (например, игнорировать VCS dirs и т. д.), Вы также можете изменить список каталогов, чтобы предотвратить ОС.пройдитесь по ним рекурсивно.
ie:
def _dir_list(self, dir_name, whitelist): outputList = [] for root, dirs, files in os.walk(dir_name): dirs[:] = [d for d in dirs if is_good(d)] for f in files: do_stuff()Примечание - будьте осторожны, чтобы изменить список, а не просто привязать его. Очевидно, ОС.walk не знает о внешней повторной привязке.
вы могли бы использовать
os.listdir()который возвращает список имен (как для файлов, так и для каталогов) в данном каталоге. Если вам нужно различать файлы и каталоги, вызовos.stat()на каждое имя.
та же идея с
listdir, но короче:[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]
в Python 3, я смог сделать это:
import os dir = "/path/to/files/" #List all files immediately under this folder: print ( next( os.walk(dir) )[2] ) #List all folders immediately under this folder: print ( next( os.walk(dir) )[1] )
хотелось бросить мои 2 пенса.
baselevel = len(rootdir.split("\")) for subdirs, dirs, files in os.walk(rootdir): curlevel = len(subdirs.split("\")) if curlevel <= baselevel + 1: [do stuff]
вы также можете сделать следующее:
for path, subdirs, files in os.walk(dir_name): for name in files: if path == ".": #this will filter the files in the current directory #code here
вот как я решил это
if recursive: items = os.walk(target_directory) else: items = [next(os.walk(target_directory))] ...
есть уловка при использовании listdir. ОС.путь.isdir (идентификатор) должен быть абсолютным путем. Чтобы выбрать подкаталоги вы делаете:
for dirname in os.listdir(rootdir): if os.path.isdir(os.path.join(rootdir, dirname)): print("I got a subdirectory: %s" % dirname)альтернативой является переход в каталог для выполнения тестирования без ОС.путь.присоединяться.)(
вы можете использовать этот фрагмент
for root, dirs, files in os.walk(directory): if level > 0: # do some stuff else: break level-=1
создайте список исключений, используйте fnmatch, чтобы пропустить структуру каталогов и выполнить процесс
excludes= ['a\*\b', 'c\d\e'] for root, directories, files in os.walk('Start_Folder'): if not any(fnmatch.fnmatch(nf_root, pattern) for pattern in excludes): for root, directories, files in os.walk(nf_root): .... do the process ....то же, что и для "включает":
if **any**(fnmatch.fnmatch(nf_root, pattern) for pattern in **includes**):
Comments