В Python, как найти все файлы в каталоге, включая файлы в подкаталогах? - PullRequest
4 голосов
/ 19 мая 2010

Существуют ли встроенные функции для поиска всех файлов в определенном каталоге, включая файлы в подкаталогах? Я пробовал этот код, но не работает ... может быть, сама логика неверна ...

def fun(mydir):
    lis=glob.glob(mydir)
    length=len(lis)
    l,i=0,0
    if len(lis):
        while(l+i<length):
            if os.path.isfile(lis[i]):
                final.append(lis[i])
                lis.pop(i)
                l=l+1
                i=i+1
            else:
                i=i+1
            print final
        fun(lis)
    else:
        print final

Ответы [ 3 ]

12 голосов
/ 19 мая 2010

Встроенной функции нет, но с помощью os.walk ее тривиально построить:

import os
def recursive_file_gen(mydir):
    for root, dirs, files in os.walk(mydir):
        for file in files:
            yield os.path.join(root, file)

ETA : функция os.walk рекурсивно обходит дерево каталогов; функция recursive_file_gen является генератором (использует ключевое слово yield для создания следующего файла). Чтобы получить полученный список, выполните:

list(recursive_file_gen(mydir))
3 голосов
/ 19 мая 2010

Я настоятельно рекомендую этот модуль пути, написанный Джейсоном Орендорффом:

http://pypi.python.org/pypi/path.py/2.2

К сожалению, его веб-сайт сейчас недоступен, но вы все равно можете скачать по вышеуказанной ссылке (или через easy_install, если хотите).

Используя этот модуль путей, вы можете выполнять различные действия с путями, включая файлы, которые вы запрашивали. Вот пример:

from path import path

my_path = path('.')

for file in my_path.walkfiles():
    print file

for file in my_path.walkfiles('*.pdf'):
    print file

Есть также вспомогательные функции для многих других вещей, связанных с путями:

In [1]: from path import path

In [2]: my_dir = path('my_dir')

In [3]: my_file = path('readme.txt')

In [5]: print my_dir / my_file
my_dir/readme.txt

In [6]: joined_path = my_dir / my_file

In [7]: print joined_path
my_dir/readme.txt

In [8]: print joined_path.parent
my_dir

In [9]: print joined_path.name
readme.txt

In [10]: print joined_path.namebase
readme

In [11]: print joined_path.ext
.txt

In [12]: joined_path.copy('some_output_path.txt')

In [13]: print path('some_output_path.txt').isfile()
True

In [14]: print path('some_output_path.txt').isdir()
False

Есть и другие операции, которые тоже можно выполнить, но это те, которые я использую чаще всего. Обратите внимание, что класс path наследуется от string, поэтому его можно использовать везде, где используется string. Также обратите внимание, что два или более объекта path можно легко объединить с помощью переопределенного оператора /.

Надеюсь, это поможет!

2 голосов
/ 19 мая 2010

os.walk () - это то, что вам нужно.

Но для повышения производительности попробуйте пакет scandir . Он также является частью стандартной библиотеки в Python 3.5 и описан в PEP 471

...