Glob.glob: примеры (PYTHON)
glob.glob(pathname: str): listОписание функции glob.glob
Функция glob.glob() из стандартного модуля glob применяется для поиска файлов и каталогов по заданному шаблону. Этот метод часто используется в задачах обработки файловой системы, когда необходимо получить список путей, соответствующих определенному паттерну с использованием специальных символов подстановки.
Функция принимает следующие аргументы:
- pathname (обязательный): Строка, определяющая шаблон для поиска. Может содержать специальные символы:
*(соответствует любой последовательности символов),?(соответствует любому одному символу),[](соответствует одному символу из указанного набора или диапазона). Для рекурсивного поиска используется**. - root_dir (необязательный, версия Python 3.10+): Путь к корневому каталогу, относительно которого выполняется поиск. Если
None(по умолчанию), поиск ведется относительно текущего рабочего каталога. - recursive (необязательный, логический): Если установлено
True, шаблон**вpathnameбудет соответствовать любым файлам и каталогам рекурсивно. По умолчаниюFalse. - include_hidden (необязательный, логический, версия Python 3.11+): Если установлено
True, шаблон будет соответствовать также файлам и каталогам, имена которых начинаются с точки (.). По умолчаниюFalse.
Функция возвращает список строк, содержащих пути, которые соответствуют заданному шаблону. Порядок элементов в списке не определен. Если совпадений не найдено, возвращается пустой список.
Базовые примеры использования
Поиск всех файлов с расширением .txt в текущем каталоге:
import glob
result = glob.glob('*.txt')
print(result)['file1.txt', 'file2.txt', 'readme.txt']
Поиск всех файлов с именем 'data' и любым расширением:
import glob
result = glob.glob('data.*')
print(result)['data.csv', 'data.json']
Рекурсивный поиск всех Python файлов:
import glob
result = glob.glob('**/*.py', recursive=True)
print(result[:3])['main.py', 'utils/helper.py', 'scripts/run.py']
Использование параметра root_dir:
import glob
result = glob.glob('*.log', root_dir='/var/log')
print(result)['syslog', 'auth.log']
Альтернативные функции в Python
В стандартной библиотеке Python существуют другие инструменты для работы с файловой системой:
- os.listdir(): Возвращает список всех записей в каталоге. Не поддерживает фильтрацию по шаблону. Используется, когда необходим простой перебор содержимого каталога без сложных условий.
- pathlib.Path.glob(): Часть модуля
pathlib. Выполняет аналогичнуюglob.glob()задачу, но возвращает генератор объектовPath, что удобно для современной объектно-ориентированной работы с путями. Предпочтительнее в новых проектах. - os.walk(): Позволяет рекурсивно обходить дерево каталогов, предоставляя больше контроля на каждом уровне (списки каталогов и файлов). Применяется, когда логика обработки зависит от структуры вложенных папок.
- fnmatch.fnmatch(): Функция для проверки соответствия отдельной строки шаблону без сканирования файловой системы. Полезна для фильтрации уже полученного списка имен.
Аналоги в других языках программирования
PHP: glob()
<?
$result = glob('*.txt');
print_r($result);
?>Array
(
[0] => file1.txt
[1] => file2.txt
)JavaScript (Node.js): fs.readdirSync() с фильтрацией
const fs = require('fs');
const path = require('path');
const dir = '.';
const files = fs.readdirSync(dir).filter(file => file.endsWith('.js'));
console.log(files);['app.js', 'index.js']
Java: Files.newDirectoryStream() с шаблоном
import java.nio.file.*;
import java.util.ArrayList;
try (DirectoryStream stream = Files.newDirectoryStream(Paths.get("."), "*.txt")) {
ArrayList list = new ArrayList<>();
for (Path entry: stream) list.add(entry.toString());
System.out.println(list);
} [./notes.txt, ./data.txt]
SQL (в некоторых СУБД): LIKE или SIMILAR TO - используются для поиска строк в таблицах, не для файловой системы.
Golang: filepath.Glob
package main
import (
"fmt"
"path/filepath"
)
func main() {
matches, _ := filepath.Glob("*.go")
fmt.Println(matches)
}[main.go utils.go]
Распространенные ошибки
Забывают, что возвращается список, а не итератор или генератор:
import glob
for file in glob.glob('*.txt'): # Корректно
print(file)
# Попытка использовать next() приведет к ошибке
try:
first = next(glob.glob('*.txt'))
except TypeError as e:
print(f'Ошибка: {e}')file1.txt file2.txt Ошибка: 'list' object is not an iterator
Использование неэкранированных специальных символов в именах файлов:
import glob
# Поиск файла с именем 'file[1].txt' может быть неверно интерпретирован
result = glob.glob('file[1].txt') # Ищет 'file1.txt', а не 'file[1].txt'
print(result)['file1.txt'] # Неожиданный результат
Пренебрежение абсолютными и относительными путями:
import os
import glob
os.chdir('/tmp')
# Шаблон задан относительно текущего каталога
result = glob.glob('*.log')
print(result)['system.log'] # Файлы из /tmp, а не из исходного каталога скрипта
Изменения в последних версиях Python
В Python 3.10 был добавлен параметр root_dir, позволяющий задавать корневой каталог для поиска без изменения текущего рабочего каталога.
В Python 3.11 появился параметр include_hidden. При значении True шаблон начинает соответствовать также скрытым файлам и каталогам (имена которых начинаются с точки). Это упрощает работу с такими файлами, особенно в UNIX-подобных системах.
import glob
# Без флага (по умолчанию)
default = glob.glob('*')
# С флагом
with_hidden = glob.glob('*', include_hidden=True)
print('Без скрытых:', default)
print('Со скрытыми:', with_hidden)Без скрытых: ['data', 'main.py'] Со скрытыми: ['.config', '.gitignore', 'data', 'main.py']
Расширенные примеры применения
Фильтрация по нескольким расширениям:
import glob
patterns = ['*.jpg', '*.png', '*.gif']
image_files = []
for pattern in patterns:
image_files.extend(glob.glob(pattern))
print(sorted(image_files))['cat.jpg', 'diagram.png', 'logo.gif']
Поиск файлов, соответствующих сложному шаблону с символами диапазона:
import glob
# Найти файлы 'test1.txt', 'test2.txt', ..., 'test5.txt'
files = glob.glob('test[1-5].txt')
print(files)['test1.txt', 'test2.txt', 'test3.txt']
Рекурсивный поиск с ограничением глубины с помощью комбинации паттернов:
import glob
# Найти все .py файлы в корне и на один уровень вглубь
files = glob.glob('*.py') + glob.glob('*/*.py')
print(files)['app.py', 'utils/helpers.py', 'tests/test_app.py']
Игнорирование регистра на файловых системах, нечувствительных к регистру (например, Windows или настроенный ext4):
import glob
# Находит 'readme.txt', 'README.TXT', 'ReadMe.Txt' и т.д.
files = glob.glob('*.[Tt][Xx][Tt]')
print(files)['readme.txt', 'README.TXT']
Поиск только каталогов с помощью рекурсивного шаблона и проверки:
import os
import glob
# Рекурсивный поиск всех элементов
all_items = glob.glob('**', recursive=True)
# Фильтрация только каталогов
dirs = [item for item in all_items if os.path.isdir(item)]
print(dirs)['', 'docs', 'src', 'src/modules']