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
- Другой случай, когда множество возможных подходов и все связанные с ними предос ...
Ответ #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
- @ 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 указывает, насколько глубока рекурсия.
- Я просто добавил +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
- Это должен был быть принятый ответ. Просто ...
Ответ #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))
- О, я получал от этого какую-т ...
Ответ #5
Ответ на вопрос: os.walk, не копаясь в каталогах ниже
Вы можете использовать os.listdir()
, который возвращает 9X_python список имен (как для файлов, так и для каталогов) в 9X_pythonista заданном каталоге. Если вам нужно различать 9X_os.walk файлы и каталоги, вызывайте os.stat()
для каждого 9X_python имени.
Ответ #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 не знает о внешнем перепривязке.
Ответ #7
Ответ на вопрос: os.walk, не копаясь в каталогах ниже
for path, dirs, files in os.walk('.'): print path, dirs, files del dirs[:] # go only one level deep
9X_python-shell
Ответ #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
Ответ #9
Ответ на вопрос: os.walk, не копаясь в каталогах ниже
Та же идея с listdir
, но короче:
[f for f in os.listdir(root_dir) if os.path.isfile(os.path.join(root_dir, f))]
9X_pythonista
Ответ #10
Ответ на вопрос: os.walk, не копаясь в каталогах ниже
Начиная с Python 3.5, вы можете использовать os.scandir
вместо 9X_pythonista os.listdir
. Вместо строк вы получаете взамен итератор 9X_files объектов DirEntry
. Из документов:
Использование
scandir()
вместо 9X_os.walklistdir()
может значительно повысить производительность 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
- Мало того, что вы можете использовать, вы ** должны ** использовать `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
- Не будет ли эта процедура без надобности ...
Ответ #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
Ответ #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
- Привет, Рич, добро пожаловать в Stack Overflow! Спасибо за этот фрагмент кода, который может предоставить некоторую краткосрочную помощь. Правильное объяснение [могло бы значительно улучшить] ...
-
5
-
4
-
1
-
3
-
1
-
3
-
1
-
1
-
11
-
3
-
12
-
3
-
1
-
1
-
3
-
13
-
22
-
42
-
6
-
14
-
19
-
7
-
22
-
5
-
6
-
19
-
22
-
6
-
7
-
10
-
8
-
12
-
4
-
5
-
18
-
3
-
5
-
9
-
2
-
7
-
5
-
4
-
4
-
4
-
7
-
7
-
8
-
12
-
5
-
18