Glob.glob: примеры (PYTHON)

Работа с функцией 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']

Расширенные примеры применения

Фильтрация по нескольким расширениям:

Пример python
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']

Поиск файлов, соответствующих сложному шаблону с символами диапазона:

Пример python
import glob
# Найти файлы 'test1.txt', 'test2.txt', ..., 'test5.txt'
files = glob.glob('test[1-5].txt')
print(files)
['test1.txt', 'test2.txt', 'test3.txt']

Рекурсивный поиск с ограничением глубины с помощью комбинации паттернов:

Пример python
import glob
# Найти все .py файлы в корне и на один уровень вглубь
files = glob.glob('*.py') + glob.glob('*/*.py')
print(files)
['app.py', 'utils/helpers.py', 'tests/test_app.py']

Игнорирование регистра на файловых системах, нечувствительных к регистру (например, Windows или настроенный ext4):

Пример python
import glob
# Находит 'readme.txt', 'README.TXT', 'ReadMe.Txt' и т.д.
files = glob.glob('*.[Tt][Xx][Tt]')
print(files)
['readme.txt', 'README.TXT']

Поиск только каталогов с помощью рекурсивного шаблона и проверки:

Пример python
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']

питон glob.glob function comments

En
Glob.glob Find pathnames matching pattern