Чтобы при помощи кода на Python найти все файлы, имеющие заданное расширение, можно использовать функцию os.walk. С ее помощью вы обойдете структуру каталогов и проверите расширение каждого файла, используя метод file.endswith().
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
Примечание редакции: о том, как вообще выводить списки файлов , читайте в статье «Как получить список файлов в каталоге с помощью Python».
Например, давайте найдем все файлы с расширением .txt:
import os
for root, dirs, files in os.walk('/path/to/directory'):
for file in files:
if file.endswith('.txt'):
print(os.path.join(root, file))
Этот код выведет полный путь ко всем файлам с расширением .txt в указанном каталоге. Вы можете заменить .txt на любое другое расширение файла.
Если вы ищете быстрый ответ, я уверен, что вышеприведенное решение подойдет!
Но если вы хотите улучшить свои навыки работы с Python и узнать, как рекурсивно находить файлы в каталоге с подкаталогами, продолжайте читать. Это руководство познакомит вас с тремя методами, которые можно использовать для поиска файлов определенного типа в Python.
Давайте приступим!
Поиск файлов по расширению в Python
Python предлагает три основных способа поиска файлов по расширению:
- Модуль
glob - Функция
os.listdir - Функция
os.walk
Давайте рассмотрим подробнее, как работает каждый из этих подходов.
1. Модуль glob
Для примера найдем при помощи модуля Python glob все файлы, имеющие расширение .txt:
import glob
# Find all files with the .txt extension in the current directory
txt_files = glob.glob('*.txt')
# Print the names of the files found
print(txt_files)
Функция glob.glob() ищет в текущем каталоге все файлы, соответствующие заданному шаблону. В данном случае шаблон — '*.txt', т.е. все файлы, имена которых заканчиваются на .txt. Результатом будет список имен файлов.
Вы также можете указать другой каталог для поиска, передав путь к каталогу в качестве первого аргумента функции glob.glob(). Например, если вы хотите найти все файлы .txt в каталоге /path/to/directory, выполните следующее:
import glob
# Find all files with the .txt extension in the specified directory
txt_files = glob.glob('/path/to/directory/*.txt')
# Print the names of the files found
print(txt_files)
Пример
У меня есть проект со следующей древовидной структурой:
. ├── Data │ ├── ages.txt │ └── numbers.txt ├── Images │ └── image.png ├── Samples │ ├── codes.txt │ └── readme.txt ├── finder.py ├── names.txt └── values.txt
Давайте при помощи Python найдем в текущей папке все текстовые файлы, т.е. имеющие расширение .txt. Для этого выполним код из предыдущего раздела и посмотрим, что произойдет:
import glob
# Find all files with the .txt extension in the current directory
txt_files = glob.glob('*.txt')
# Print the names of the files found
print(txt_files)
# Вывод:
# ['names.txt', 'values.txt']
Код возвращает файлы 'names.txt' и 'values.txt', но не текстовые файлы во вложенных папках. Чтобы перечислить файлы с определенным расширением во вложенных папках, необходимо использовать рекурсивный подход.
2. Рекурсивный поиск файлов с определенным расширением
Как вы видели в предыдущем примере, функция glob.glob() ищет файлы только в указанном каталоге и не ищет ни в одном из его подкаталогов.
Для поиска файлов с определенным расширением в указанном каталоге и во всех его подкаталогах можно использовать функцию os.listdir() рекурсивным способом.
Вот пример реализации:
import os
def find_files(dir_path, extension):
# Check if the given path is a valid directory
if not os.path.isdir(dir_path):
return
# Get a list of all the files and directories in the given directory
files_and_dirs = os.listdir(dir_path)
# Iterate over the list of files and directories
for file_or_dir in files_and_dirs:
# Construct the full path of the file or directory
full_path = os.path.join(dir_path, file_or_dir)
# If the full path is a directory, recursively call the function to find the files in that directory
if os.path.isdir(full_path):
find_files(full_path, extension)
else:
# If the full path is a file that ends with extension, print its path
if full_path.endswith(extension):
print(full_path)
Этот код определяет рекурсивную функцию find_files(), которая принимает в качестве аргумента путь к каталогу и ищет файлы в этом каталоге и всех его подкаталогах.
Она использует функцию os.listdir() для получения имен всех файлов и каталогов в указанном каталоге, а затем — функцию os.path.isdir() для проверки, является ли данный файл или каталог каталогом. Если это каталог, функция вызывает себя рекурсивно для поиска файлов с определенным расширением в этом каталоге. Если это файл, функция проверяет расширение и выводит имя файла, если оно заканчивается целевым расширением.
Давайте вызовем эту функцию, чтобы увидеть ее в действии.
Пример
Продолжим работу с папкой проекта Example со следующей структурой:
. ├── Data │ └── ages.txt │ └── numbers.txt ├── Images │ └── image.png ├── Samples │ └── codes.txt │ └── readme.txt ├── finder.py ├── names.txt └── values.txt
Наша цель — найти в папке и ее подпапках все файлы, имеющие расширение .txt, выполнив Python-скрипт в файле finder.py.
Для этого скопируем функцию find_files из предыдущего раздела в файл finder.py. Вызовем функцию, задав в качестве параметров текущий каталог и .txt:
find_files('.', '.txt')
Вывод:
./Data/numbers.txt ./Data/ages.txt ./Samples/readme.txt ./Samples/codes.txt ./names.txt ./values.txt
Потрясающе! На этот раз функция нашла текстовые файлы не только на том же уровне, что и файл Python, но и во вложенных папках.
Несмотря на то, что этот пример дает отличную практику работы с рекурсией в Python, существует более простая альтернатива для поиска файлов.
3. Рекурсивный поиск файлов при помощи os.walk
Самый простой способ рекурсивного поиска всех файлов с определенным расширением в папке и ее подпапках — это использование функции os.walk.
Вот как может выглядеть ее вызов:
import os
for root, dirs, files in os.walk('/path/to/directory'):
for file in files:
if file.endswith('.someextension'):
print(os.path.join(root, file))
Этот код импортирует модуль os, который предоставляет функции для взаимодействия с операционной системой. Затем он использует функцию os.walk() для рекурсивного перебора всех каталогов и подкаталогов внутри указанного каталога ('/path/to/directory').
Для каждого каталога в дереве он устанавливает три переменные: root, dirs и files. Переменная root содержит путь к текущему каталогу, dirs — список подкаталогов в этом каталоге, а files — список файлов в текущем каталоге.
Затем программа перебирает список файлов в текущем каталоге и проверяет, заканчивается ли файл указанным расширением. Если да, то печатает полный путь к этому файлу с помощью функции os.path.join(). Это позволяет найти все файлы с указанным расширением во всем дереве каталогов, а не только в текущем каталоге.
Это удобная замена довольно длинной рекурсии из предыдущего раздела.
Пример
Давайте продолжим использовать структуру проекта, которую вы уже видели в этом руководстве, и найдем все файлы .txt в папке и ее подпапках.
. ├── Data │ └── ages.txt │ └── numbers.txt ├── Images │ └── image.png ├── Samples │ └── codes.txt │ └── readme.txt ├── finder.py ├── names.txt └── values.txt
Для этого изменим ранее представленный код так, чтобы он был нацелен на текущую папку и показывал только файлы с расширением .txt:
import os
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith('.txt'):
print(os.path.join(root, file))
Запуск finder.py с приведенным выше кодом показывает все файлы с расширением .txt:
% python3 finder.py ./names.txt ./values.txt ./Data/numbers.txt ./Data/ages.txt ./Samples/readme.txt ./Samples/codes.txt
Заключение
Сегодня вы узнали, как найти файлы с определенным расширением в Python. В качестве домашнего задания используйте функцию os.walk(), чтобы рекурсивно пройтись по папкам и подпапкам и найти все файлы с определенным расширением.
Спасибо за внимание. Успешного кодинга!
Перевод статьи Artturi Jalli «Python Find Files with Extension (.txt): A Step-by-Step Guide»
