Как использовать glob () для рекурсивного поиска файлов? - PullRequest
622 голосов
/ 02 февраля 2010

Вот что у меня есть:

glob(os.path.join('src','*.c'))

но я хочу найти подпапки в src. Примерно так будет работать:

glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))

Но это явно ограничено и неуклюже.

Ответы [ 23 ]

0 голосов
/ 27 января 2014
import sys, os, glob

dir_list = ["c:\\books\\heap"]

while len(dir_list) > 0:
    cur_dir = dir_list[0]
    del dir_list[0]
    list_of_files = glob.glob(cur_dir+'\\*')
    for book in list_of_files:
        if os.path.isfile(book):
            print(book)
        else:
            dir_list.append(book)
0 голосов
/ 30 июня 2015

Вот решение, которое сопоставит шаблон с полным путем, а не только с базовым именем файла.

Он использует fnmatch.translate для преобразования шаблона стиля глобуса в регулярное выражение, которое затем сопоставляется с полным путем каждого файла, найденного при обходе каталога.

re.IGNORECASE необязательно, но желательно в Windows, поскольку в самой файловой системе не учитывается регистр. (Я не удосужился скомпилировать регулярное выражение, поскольку в документах указано, что его следует кэшировать внутри.)

import fnmatch
import os
import re

def findfiles(dir, pattern):
    patternregex = fnmatch.translate(pattern)
    for root, dirs, files in os.walk(dir):
        for basename in files:
            filename = os.path.join(root, basename)
            if re.search(patternregex, filename, re.IGNORECASE):
                yield filename
0 голосов
/ 15 ноября 2014

Я изменил верхний ответ в этой публикации ... и недавно создал этот скрипт, который будет проходить по всем файлам в данном каталоге (searchdir) и подкаталогах в нем ... и печатать имя файла, rootdir, updated / creation дата и размер.

Надеюсь, это кому-нибудь поможет ... и они могут пройти по каталогу и получить информацию о файле.

import time
import fnmatch
import os

def fileinfo(file):
    filename = os.path.basename(file)
    rootdir = os.path.dirname(file)
    lastmod = time.ctime(os.path.getmtime(file))
    creation = time.ctime(os.path.getctime(file))
    filesize = os.path.getsize(file)

    print "%s**\t%s\t%s\t%s\t%s" % (rootdir, filename, lastmod, creation, filesize)

searchdir = r'D:\Your\Directory\Root'
matches = []

for root, dirnames, filenames in os.walk(searchdir):
    ##  for filename in fnmatch.filter(filenames, '*.c'):
    for filename in filenames:
        ##      matches.append(os.path.join(root, filename))
        ##print matches
        fileinfo(os.path.join(root, filename))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...