os.walk, не копаясь в каталогах ниже

Как сделать так, чтобы os.walk возвращал только 9X_files файлы в указанном мной каталоге?

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

129
1

  • Другой случай, когда множество возможных подходов и все связанные с ними предос ...
13
Общее количество ответов: 13

Ответ #1

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Не используйте os.walk.

Пример:

import os

root = "C:\\"
for item in os.listdir(root):
    if os.path.isfile(os.path.join(root, item)):
        print item

9X_pythonista

237
2

  • @ 576i: это не делает р ...

Ответ #2

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Используйте функцию 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[:]

Он работает так же, как 9X_python os.walk, но вы можете передать ему параметр level, который 9X_files указывает, насколько глубока рекурсия.

113
5

  • Я просто добавил +1, потому что не мог "удалить" каталоги. Я пробовал `dirs = []` и `dirs = None`, но они не работали. `map (dirs.remove, dirs)` работал, но с некоторыми нежелате ...

Ответ #3

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Думаю, решение на самом деле очень простое.

использовать

break

чтобы 9X_python-interpreter выполнить только первую итерацию цикла for, должен 9X_python быть более элегантный способ.

for root, dirs, files in os.walk(dir_name):
    for f in files:
        ...
        ...
    break
...

В первый раз, когда 9X_os.walk вы вызываете os.walk, он возвращает тюльпаны 9X_pythonista для текущего каталога, а затем в следующем 9X_py цикле содержимое следующего каталога.

Возьмите 9X_python исходный сценарий и просто добавьте перерыв.

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

64
1

  • Это должен был быть принятый ответ. Просто ...

Ответ #4

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Хорошее предложение использовать listdir. Прямой 9X_pythonic ответ на ваш вопрос в Python 2: root, dirs, files = os.walk(dir_name).next().

Эквивалентный 9X_pythonista синтаксис Python 3: root, dirs, files = next(os.walk(dir_name))

27
3

  • О, я получал от этого какую-т ...

Ответ #5

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Вы можете использовать os.listdir(), который возвращает 9X_python список имен (как для файлов, так и для каталогов) в 9X_pythonista заданном каталоге. Если вам нужно различать 9X_os.walk файлы и каталоги, вызывайте os.stat() для каждого 9X_python имени.

15
0

Ответ #6

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Если у вас есть более сложные требования, чем 9X_pythonista только верхний каталог (например, игнорировать 9X_files каталоги VCS и т. д.), вы также можете изменить 9X_python список каталогов, чтобы предотвратить повторное 9X_os.walk прохождение через них os.walk.

т.е.

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()

Примечание. Будьте 9X_python-shell осторожны, чтобы изменить список, а не просто 9X_python перепривязать его. Очевидно, что os.walk 9X_pythonista не знает о внешнем перепривязке.

10
0

Ответ #7

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

for path, dirs, files in os.walk('.'):
    print path, dirs, files
    del dirs[:] # go only one level deep

9X_python-shell

7
0

Ответ #8

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Мне захотелось бросить свои 2 пенса.

baselevel = len(rootdir.split("\\"))
for subdirs, dirs, files in os.walk(rootdir):
    curlevel = len(subdirs.split("\\"))
    if curlevel <= baselevel + 1:
        [do stuff]

9X_python

5
0

Ответ #9

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

Та же идея с listdir, но короче:

[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]

9X_pythonista

4
0

Ответ #10

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

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

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

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

4
1

  • Мало того, что вы можете использовать, вы ** должны ** использовать `scandir()`, так как он * намного * быстрее, чем `listdir()`. См. Тесты здесь: https://stackoverflow.co ...

Ответ #11

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

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

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

9X_file

2
1

  • Не будет ли эта процедура без надобности ...

Ответ #12

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

В 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] )

9X_pythonista

2
0

Ответ #13

Ответ на вопрос: os.walk, не копаясь в каталогах ниже

import os

def listFiles(self, dir_name):
    names = []
    for root, directory, files in os.walk(dir_name):
        if root == dir_name:
            for name in files:
                names.append(name)
    return names

9X_py

1
1

  • Привет, Рич, добро пожаловать в Stack Overflow! Спасибо за этот фрагмент кода, который может предоставить некоторую краткосрочную помощь. Правильное объяснение [могло бы значительно улучшить] ...