Як використовувати функцію Glob() для рекурсивного пошуку файлів у Python?
Glob — це загальний термін, який використовується для визначення методів відповідності заданим шаблонам відповідно до правил, пов’язаних з оболонкою Unix. Системи й оболонки Linux і Unix також підтримують glob і також забезпечують функцію glob()> в системних бібліотеках.
У Python для отримання використовується модуль glob файли/шляхи відповідність заданому зразку. Правила шаблону glob відповідають стандартним правилам розширення шляху Unix. Також передбачається, що згідно з тестами порівняння шляхів у каталогах він швидше, ніж інші методи. З glob ми також можемо використовувати символи підстановки ('*, ?, [ranges])> окрім точного пошуку рядка, щоб зробити пошук шляху більш простим і зручним.
Примітка: Цей модуль вбудовано в Python, тому немає необхідності встановлювати його ззовні.
приклад:
# Python program to demonstrate> # glob using different wildcards> > > import> glob> > > print> (> 'Named explicitly:'> )> for> name> in> glob.glob(> '/home/geeks/Desktop/gfg/data.txt'> ):> > print> (name)> > # Using '*' pattern> print> (> '
Named with wildcard *:'> )> for> name> in> glob.glob(> '/home/geeks/Desktop/gfg/*'> ):> > print> (name)> > # Using '?' pattern> print> (> '
Named with wildcard ?:'> )> for> name> in> glob.glob(> '/home/geeks/Desktop/gfg/data?.txt'> ):> > print> (name)> > # Using [0-9] pattern> print> (> '
Named with wildcard ranges:'> )> for> name> in> glob.glob(> '/home/geeks/Desktop/gfg/*[0-9].*'> ):> > print> (name)> |
Вихід:
Використання функції Glob() для рекурсивного пошуку файлів
Ми можемо використовувати функцію glob.glob()> або glob.iglob()> безпосередньо з модуля glob для рекурсивного отримання шляхів з каталогів/файлів і підкаталогів/підфайлів.
Синтаксис:
glob.glob(pathname, *, recursive=False)
glob.iglob(pathname, *, recursive=False)
Примітка: Коли встановлено рекурсивний True> **> за яким іде роздільник шляху ('./**/')> відповідатиме будь-яким файлам або каталогам.
приклад:
# Python program to find files> # recursively using Python> > > import> glob> > > # Returns a list of names in list files.> print> (> 'Using glob.glob()'> )> files> => glob.glob(> '/home/geeks/Desktop/gfg/**/*.txt'> ,> > recursive> => True> )> for> file> in> files:> > print> (> file> )> > > # It returns an iterator which will> # be printed simultaneously.> print> (> '
Using glob.iglob()'> )> for> filename> in> glob.iglob(> '/home/geeks/Desktop/gfg/**/*.txt'> ,> > recursive> => True> ):> > print> (filename)> |
Вихід:
Для старих версій python:
Найпростіший спосіб - використовувати os.walk() оскільки він спеціально розроблений і оптимізований для рекурсивного перегляду дерева каталогів. Або ми також можемо використовувати os.listdir() щоб отримати всі файли в каталозі та підкаталогах, а потім відфільтрувати.
Побачимо це на прикладі -
приклад:
# Python program to find files> # recursively using Python> > > import> os> > # Using os.walk()> for> dirpath, dirs, files> in> os.walk(> 'src'> ):> > for> filename> in> files:> > fname> => os.path.join(dirpath,filename)> > if> fname.endswith(> '.c'> ):> > print> (fname)> > '''> Or> We can also use fnmatch.filter()> to filter out results.> '''> for> dirpath, dirs, files> in> os.walk(> 'src'> ):> > for> filename> in> fnmatch.> filter> (files,> '*.c'> ):> > print> (os.path.join(dirpath, filename))> > # Using os.listdir()> path> => 'src'> dir_list> => os.listdir(path)> for> filename> in> fnmatch.> filter> (dir_list,> '*.c'> ):> > print> (os.path.join(dirpath, filename))> |
Вихід:
./src/add.c ./src/subtract.c ./src/sub/mul.c ./src/sub/div.c ./src/add.c ./src/subtract.c ./src/sub/mul.c ./src/sub/div.c ./src/add.c ./src/subtract.c ./src/sub/mul.c ./src/sub/div.c