Как мне ограничить 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
files_with_full_path = [f.path for f in os.scandir(dir) if f.is_file()]
. Если вам нужно использовать только имена файловf.name
вместоf.path
. Это самое быстрое решение и намного быстрее, чем любоеwalk
другоеlistdir
, см. Stackoverflow.com/a/40347279/2441026 .Ответы:
Используйте
walklevel
функцию.Он работает точно так же
os.walk
, но вы можете передать емуlevel
параметр, который указывает, насколько глубока рекурсия.источник
dirs = []
и ,dirs = None
но те не работают.map(dirs.remove, dirs)
работал, но с некоторыми напечатанными нежелательными сообщениями «[Нет]». Так почемуdel dirs[:]
именно?topdown=False
в os.walk. См. 4-й абзац в документации :Modifying dirnames when topdown is False has no effect on the behavior of the walk, because in bottom-up mode the directories in dirnames are generated before dirpath itself is generated.
dirs = []
иdirs = None
не будет работать, потому что они просто создают новый несвязанный объект и присваивают имяdirs
. Исходный объект списка необходимо изменить на месте, а не в имениdirs
.Не используйте os.walk.
Пример:
источник
os.path.isfile
иos.path.isdir
позволяет вам различать. Я не понимаю, такos.path.isfile
как в образце кода есть с '08, а ваш комментарий от '16. Это явно лучший ответ, так как вы не собираетесь просматривать каталог, а хотите его перечислить.walk
вы сразу получите отдельные списки каталогов и файлов..next()
), и он намного ближе к вашей идее.os.scandir
функцию, которая позволяет более изощренное взаимодействие файла или каталога-объекта. Смотрите мой ответ нижеЯ думаю, решение на самом деле очень простое.
использовать
чтобы выполнить только первую итерацию цикла for, должен быть более элегантный способ.
В первый раз, когда вы вызываете os.walk, он возвращает тюльпаны для текущего каталога, а затем в следующем цикле содержимое следующего каталога.
Возьмите оригинальный сценарий и просто добавьте паузу .
источник
Предложение использовать
listdir
- хорошее. Прямой ответ на ваш вопрос в Python 2 являетсяroot, dirs, files = os.walk(dir_name).next()
.Эквивалентный синтаксис Python 3:
root, dirs, files = next(os.walk(dir_name))
источник
root, dirs, files = os.walk(dir_name).next()
дает мнеAttributeError: 'generator' object has no attribute 'next'
root, dirs, files = next(os.walk(dir_name))
и тогда переменныеroot, dirs, files
будут соответствовать только переменным генератора наdir_name
уровне.Вы можете использовать
os.listdir()
which возвращает список имен (как для файлов, так и для каталогов) в заданном каталоге. Если вам нужно различать файлы и каталоги, вызывайтеos.stat()
каждое имя.источник
Если у вас есть более сложные требования, чем только верхний каталог (например, игнорировать каталоги VCS и т. Д.), Вы также можете изменить список каталогов, чтобы предотвратить повторное прохождение os.walk через них.
то есть:
Примечание - будьте осторожны, чтобы изменить список, а не просто перепривязать его. Очевидно, что os.walk не знает о внешнем перепривязке.
источник
источник
Та же идея
listdir
, но короче:источник
Я чувствовал себя так, как будто бросил свои 2 пенса.
источник
В Python 3 мне удалось это сделать:
источник
Начиная с Python 3.5 вы можете использовать
os.scandir
вместоos.listdir
. Вместо строк вы получаетеDirEntry
взамен итератор объектов. Из документов:Вы можете получить доступ к имени объекта, через
DirEntry.name
которое затем будет эквивалентно выводуos.listdir
источник
scandir()
, так как это намного быстрее, чемlistdir()
. См. Тесты здесь: stackoverflow.com/a/40347279/2441026 .Вы также можете сделать следующее:
источник
Вот как я это решил
источник
При использовании listdir есть загвоздка. Os.path.isdir (идентификатор) должен быть абсолютным путем. Чтобы выбрать подкаталоги, вы:
Альтернативой является переход в каталог для проведения тестирования без os.path.join ().
источник
Вы можете использовать этот фрагмент
источник
создать список исключений, использовать fnmatch, чтобы пропустить структуру каталогов и выполнить процесс
то же, что и для "включает":
источник
Почему бы просто не использовать
range
и вos.walk
сочетании сzip
? Не лучшее решение, но тоже подойдет.Например так:
У меня работает на python 3.
Также: A
break
тоже попроще. (Посмотрите ответ от @Pieter)источник
Небольшое изменение в ответе Алекса, но с использованием
__next__()
:print(next(os.walk('d:/'))[2])
илиprint(os.walk('d:/').__next__()[2])
с
[2]
будучиfile
вroot, dirs, file
упомянутых в других ответахисточник
корневая папка изменяется для каждого каталога, который находит os.walk. Я решил эту проверку, если root == directory
источник
источник