ОС.ходите не копаясь в каталогах ниже



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

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] )
for path, dirs, files in os.walk('.'):
    print path, dirs, files
    del dirs[:] # go only one level deep

хотелось бросить мои 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

    Ничего не найдено.