os.walk без копания в каталогах ниже - PullRequest
86 голосов
/ 23 октября 2008

Как ограничить 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

Ответы [ 19 ]

1 голос
/ 19 октября 2012

Вы также можете сделать следующее:

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
0 голосов
/ 21 ноября 2017

создайте список исключений, используйте 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
            ....

То же, что и для «include»:

if **any**(fnmatch.fnmatch(nf_root, pattern) for pattern in **includes**):
0 голосов
/ 24 августа 2016

Вы можете использовать этот фрагмент

for root, dirs, files in os.walk(directory):
    if level > 0:
        # do some stuff
    else:
        break
    level-=1
0 голосов
/ 27 мая 2019

С Python 3.5 вы можете использовать os.scandir вместо os.listdir. Вместо строк вы получаете итератор DirEntry объектов в ответ. Из документов:

Использование scandir() вместо listdir() может значительно повысить производительность кода, который также нуждается в типе файла или информации об атрибутах файла, поскольку объекты DirEntry предоставляют эту информацию, если операционная система предоставляет ее при сканировании каталога. Все методы DirEntry могут выполнять системный вызов, но is_dir() и is_file() обычно требуют системного вызова только для символических ссылок; DirEntry.stat() всегда требует системного вызова в Unix, но требуется только один для символических ссылок в Windows.

Вы можете получить доступ к имени объекта через DirEntry.name, что эквивалентно выводу os.listdir

0 голосов
/ 30 ноября 2018

Почему бы просто не использовать range и os.walk в сочетании с zip? Это не лучшее решение, но оно тоже подойдет.

Например, вот так:

# your part before
for count, (root, dirs, files) in zip(range(0, 1), os.walk(dir_name)):
    # logic stuff
# your later part

У меня работает на питоне 3.

Также: A break, кстати, тоже проще. (Посмотрите на ответ от @Pieter)

0 голосов
/ 30 января 2019

Небольшое изменение в ответе Алекса, но с использованием __next__():

print(next(os.walk('d:/'))[2]) или же print(os.walk('d:/').__next__()[2])

с [2], являющимся file в root, dirs, file, упомянутом в других ответах

0 голосов
/ 06 января 2015

Вот как я это решил

if recursive:
    items = os.walk(target_directory)
else:
    items = [next(os.walk(target_directory))]

...
0 голосов
/ 05 июня 2019

изменения корневой папки для каждого каталога, который находит os.walk. Я решаю эту проверку, если root == каталог

def _dir_list(self, dir_name, whitelist):
    outputList = []
    for root, dirs, files in os.walk(dir_name):
        if root == dir_name: #This only meet parent folder
            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
0 голосов
/ 23 сентября 2015

Есть ошибка при использовании listdir. Os.path.isdir (идентификатор) должен быть абсолютным путем. Чтобы выбрать подкаталоги, вы делаете:

for dirname in os.listdir(rootdir):
  if os.path.isdir(os.path.join(rootdir, dirname)):
     print("I got a subdirectory: %s" % dirname)

Альтернатива - перейти в каталог для тестирования без os.path.join ().

...