Модуль glob | Python 3

Для работы с файлами и папками в Python 3 модуль glob
– незаменимая вещь. Он позволяет находить файлы, соответствующие определённому шаблону, не перебирая директорию вручную, а используя мощный механизм подстановочных знаков. Это существенно ускоряет и упрощает поиск необходимых файлов в приложениях.
Ключевые возможности модуля: поиск файлов по шаблону, поддержка подстановочных знаков (*
, ?
, [...]
), обработка множества файлов одновременно, без необходимости циклов. Например, команда glob.glob('*.txt')
вернёт список всех текстовых файлов в текущей директории. Важно: поддержка подстановочных знаков позволяет находить файлы, определённые сложными критериями – например, файлы с именем, начинающимся с «report_» и заканчивающимся на «_2023.log».
Рекомендация по применению: для быстрого поиска определённых файлов в скриптах, особенно при автоматизации задач. Использование glob
предотвращает ошибки при работе со сложными шаблонами поиска и ускоряет обработку файлов, особенно в комбинации с другими модулями, например, для обработки больших каталогов или при работе с файлами с различными именами и расширениями.
Пример использования: с помощью glob.glob("data/*.csv")
вы получите список всех файлов с расширением .csv
в подкаталоге «data». Обратите внимание на универсальность подстановочных знаков – это позволяет выполнять более сложный поиск.
Модуль glob Python 3
Для поиска файлов с определёнными именами используйте модуль glob
. Он позволяет создавать шаблоны поиска, позволяющие находить файлы по маске.
Пример 1: Поиск всех файлов с расширением ".txt" в текущей директории:
import glob
txt_files = glob.glob("*.txt")
print(txt_files)
Результат вернёт список путей к файлам с расширением .txt.
Пример 2: Поиск файлов, имена которых начинаются с "report" и заканчиваются на ".csv":
import glob
csv_files = glob.glob("report*.csv")
print(csv_files)
Этот шаблон найдёт все файлы от "report1.csv" до "report999.csv".
Пример 3: Поиск файлов в поддиректориях с расширением ".log":
import glob
log_files = glob.glob("**/log*.log", recursive=True)
print(log_files)
Флаг recursive=True
важен для поиска вложенных каталогах. Без него поиск ограничен текущим каталогом.
Символы-заменители:
*
- соответствует любой последовательности символов (включая пустую).?
- соответствует одному любому символу.[]
- соответствует любому символу из заданного набора.
Используйте эти шаблоны для гибкого поиска в вашем проекте.
Работа с шаблонами файлов
Для работы с файлами по шаблонам используйте метод glob.glob()
. Передайте ему строку с шаблоном. Шаблон может содержать дикие символы:
* - совпадает с любой последовательностью символов (включая пустую).
? - совпадает с любым одним символом.
[ ] - совпадает с любым символом из указанного набора.
[a-z] - совпадает с любой буквой от 'a' до 'z'.
Пример: для поиска всех файлов с расширением .txt в текущей директории используйте:
import glob
files = glob.glob('*.txt')
print(files)
Результат: список путей к файлам .txt.
Если вам нужны только имена файлов без путей, используйте os.path.basename()
:
import glob
import os
files_names = [os.path.basename(file) for file in glob.glob('*.txt')]
print(files_names)
Для поиска файлов в подкаталогах:
files = glob.glob('subdir/*.txt')
Эта команда найдет все файлы .txt в подкаталоге subdir
. Если подкаталога subdir
нет, то возвращаемый список будет пустым.
Для подбора файлов с учетом нескольких условий:
files = glob.glob('data/[0-9]*.csv')
Это найдет файлы, имена которых начинаются с любой цифры и заканчиваются на '.csv' в каталоге data
.
Использование метасимволов
Для поиска файлов с определёнными названиями используйте метасимволы.
Важно: Метасимволы расширяют возможности glob
, позволяя находить файлы с шаблонами в именах. Они дают возможность не перечислять каждый файл вручную.
- `*`: Соответствует любому количеству любых символов (включая ноль). Например,
'*.txt'
найдёт все файлы с расширением ".txt". - `?`: Соответствует ровно одному любому символу. Например,
'report?.txt'
найдёт файлы вида report1.txt, report2.txt и т.п. - `[]`: Соответствует любому символу из указанного набора. Например,
'[0-9].txt'
найдёт файлы вида 0.txt, 1.txt, 2.txt и т.д. - `[...]`: Дополнительные возможности для набора. Например,
'[aeiou].txt'
найдёт файлы c.txt, а.txt, i.txt и т.д. Можно задавать диапазоны:'[a-z].txt'
найдет все файлы с одним символом, который является маленькой буквой английского алфавита, заканчивающиеся на ".txt". Также можно использовать символы исключения:'[^a-z].txt'
найдёт все файлы, *кроме* файлов с односимвольным названием в нижнем регистре.
Комбинирование метасимволов:
-
'*.log'
соответствует всем файлам с расширением ".log". -
'[0-9]*report*.txt'
найдёт файлы, начинающиеся с цифры, содержащие слово "report", и имеющие расширение ".txt". -
'file[1-5].txt'
подберетfile1.txt, file2.txt
,file3.txt, file4.txt
иfile5.txt
.
Пример
'*.py'
.
Работа с путями
Для корректной работы с файлами и директориями в модуле glob
необходимо правильно обращаться с путями. Ниже примеры:
Пример | Описание |
---|---|
import os
os.path.join("путь1", "путь2") |
Объединяет пути. Полезно для создания корректных путей на разных системах (Windows, Linux). |
import os
os.path.abspath("относительный_путь") |
Преобразует относительный путь в абсолютный. Гарантирует однозначность расположения. |
import os
os.path.exists("путь") |
Проверяет существование файла или директории по указанному пути. Используйте перед операцией с файлом. |
import os
os.path.isdir("путь") |
Проверяет, является ли указанный путь директорией. |
import os
os.path.isfile("путь") |
Проверяет, является ли указанный путь файлом. |
import os
os.path.basename("полный_путь") |
Возвращает имя файла или директории из полного пути. |
import os
os.path.splitext("имя_файла.расширение") |
Разделяет имя файла и расширение. |
Важно: Используйте функции модуля os.path
для работы с путями. Это гарантирует переносимость кода между разными операционными системами. Не полагайтесь на "жесткий" поиск.
Обработка найденных файлов
После использования модуля glob
для поиска файлов, необходимо корректно обработать результаты. Ключевой момент - цикл. Обработайте каждый найденный файл последовательно:
Пример:
import glob pattern = '*.txt' files = glob.glob(pattern) for file in files: with open(file, 'r', encoding='utf-8') as f: content = f.read() # Добавьте свою логику обработки содержимого файла. # Например, подсчёт количества строк, поиск определённых слов, etc. lines_count = len(content.split(' ')) print(f'Файл {file}: {lines_count} строк')
Рекомендации:
- Используйте
try...except
блоки для обработки возможных ошибок (например, FileNotFoundError, ошибок доступа к файлу). - Укажите кодировку файла при открытии, чтобы избежать проблем с нестандартными наборами символов (например,
encoding='utf-8'
). - Важная деталь: в цикле каждый файл обрабатывается отдельно. Не пытайтесь обработать сразу все файлы без цикла.
- Продумайте, как использовать полученные данные. Примените их к дальнейшей работе программы, например, в вычислениях, отчётах или базах данных.
Обработка ошибок
Для обработки ошибок при работе с модулем glob
в Python 3 используйте структурированный подход, включающий try-except
блоки.
Пример 1: Обработка отсутствия файла:
import glob try: files = glob.glob("несуществующий_файл*.txt") if files: print(f"Найденные файлы: {files}") else: print("Файлы не найдены.") except FileNotFoundError: print("Ошибка: Файл не найден.") except Exception as e: print(f"Возникла ошибка: {e}")
Пример 2: Обработка неверного пути:
import glob try: files = glob.glob("C:/путь/к/несуществующему/каталогу/*.txt") print(f"Найденные файлы: {files}") except FileNotFoundError: print("Ошибка: Такого каталога не существует.") except Exception as e: print(f"Возникла ошибка: {e}")
FileNotFoundError
– для ситуаций, когда указанный файл или каталог не найден.- Общий
except
блок – для обработки других возможных ошибок (например, неправильный формат пути). - Проверка результата
if files:
– важный шаг. Если функцияglob.glob()
вернёт пустой список, это не ошибка, а просто отсутствие совпадений.
Важно! Вместо исключительной ситуации, можно проверить наличие каталога или файла перед вызовом glob.glob()
. Это позволяет избежать дополнительного кода обработки ошибок внутри блока try-except
. Например, с помощью функции os.path.exists()
.
import glob import os path_to_directory = "путь_к_каталогу" if os.path.exists(path_to_directory): files = glob.glob(f"{path_to_directory}/*.txt") if files: print(f"Найденные файлы: {files}") else: print("Файлы не найдены.") else: print("Ошибка: Директория не существует.")
Примеры практического применения
Поиск файлов с определённым расширением:
import glob
files = glob.glob('*.txt')
for file in files:
print(file)
Обработка файлов в папке:
import glob
import os
path = '/path/to/your/folder'
for filename in glob.iglob(os.path.join(path, '*.log')):
with open(filename, 'r') as f:
# Обрабатываем содержимое файла
# ...
print(f"Обработан файл {filename}")
Поиск файлов с определённым шаблоном:
import glob
files = glob.glob('data_report_*_2023.csv')
for file in files:
print(file)
Этот код находит все файлы, имя которых начинается с 'data_report_', содержит произвольное количество символов, затем '_2023' и имеет расширение '.csv'.
Обработка файлов в нескольких подкаталогах:
import glob
import os
path = '/path/to/your/folder'
for folder in glob.glob(os.path.join(path, '*')):
if os.path.isdir(folder):
for filename in glob.iglob(os.path.join(folder, '*.txt')):
print(filename)
Этот пример демонстрирует рекурсивное перечисление текстовых файлов (*.txt), находящихся в подкаталогах папки. Используется glob.iglob
для повышения эффективности обработки больших объёмов данных.
Вопрос-ответ:
Как использовать модуль glob для поиска файлов с определённым расширением в заданной директории? Приведите пример.
Модуль `glob` позволяет находить файлы и папки по шаблону. Чтобы найти все файлы с расширением `.txt` в директории 'documents', используйте `glob.glob('documents/*.txt')`. Этот код вернёт список путей к найденным файлам. Например, если в папке 'documents' есть файлы 'report.txt' и 'notes.txt', то результат будет: ['documents/report.txt', 'documents/notes.txt']. Шаблон может содержать символы-заменители: `*` — произвольная последовательность символов, `?` — любой один символ. Если нужно найти файлы, имена которых начинаются с 'report', можно использовать `glob.glob('documents/report*.txt')` — это найдёт 'report.txt', 'report123.txt' и т.д.
Какие возможности предоставляет модуль glob для поиска файлов с учётом структуры каталогов?
`glob` позволяет искать файлы не только в одной папке, но и вложенных. Например, для поиска всех `.py`-файлов в подпапках директории 'src' используйте: `glob.glob('src/**/*.py')`. Двойной `**` указывает на рекурсивный поиск. Это означает, что `glob` будет искать в директории 'src' и во всех её подпапках.
Можно ли использовать glob для поиска не только файлов, но и папок?
Да, модуль `glob` может найти папки. Например, для поиска всех подпапок внутри папки 'projects', которые начинаются с 'task', используйте: `glob.glob('projects/task*')`. Важно понимать, что это найдёт только названия подпапок, а не содержимое. Для доступа к содержимому подпапки, вам потребуется дополнительное кодирование. Например, если понадобится работать с `.txt` файлами в найденных папках, нужно будет использовать внутри цикла, или подобной конструкции, дополнительный код для поиска внутри папок.
В чем отличие регулярных выражений от шаблонов glob? В каких ситуациях glob предпочтительнее?
Регулярные выражения (например, с помощью модуля `re`) обеспечивают более гибкие возможности поиска. Они позволяют описывать сложные шаблоны, с использованием метасимволов для более точного поиска. Однако glob – проще для простых поисков. Если нужно найти файлы с определенным расширением или структурой имени файла без особых сложностей, то glob значительно проще и удобнее для применения в таких случаях.
В случае большого количества файлов, как эффективно использовать glob для избегания проблем с производительностью?
Для обработки очень большого количества файлов, важно оптимизировать поиск. Если у вас очень много файлов, и требуется поиск по огромному количеству папок, глобальный поиск может быть слишком медленным. В таких ситуациях, предпочтительней (а иногда и единственно возможным) решением используется сочетание алгоритмов и структур данных. Нужно чётко определить шаблон поиска (`*.txt`) вместо более сложных, и проводить поиски по узким, а не всем папкам. Это может существенно увеличить скорость работы, особенно когда файлы разбросаны по огромным каталогам.