В этой статье мы рассмотрим, как получить список файлов в каталоге при помощи Python. Существует несколько способов сделать это. Мы будем использовать следующие четыре метода:
Скачивайте книги ТОЛЬКО на русском языке у нас в телеграм канале: PythonBooksRU
os.listdir('dir_path')
: возвращает список файлов и каталогов, присутствующих в указанном пути к каталогуos.walk('dir_path')
: позволяет рекурсивно получить список файлов в каталоге и подкаталогахos.scandir('path')
: возвращает записи каталога вместе с информацией об атрибутах файловglob.glob('pattern')
: позволяет получить список файлов и папок, имена которых соответствуют определенному шаблону
Как вывести список всех файлов в каталоге
Получить список файлов каталога проще простого! Используйте функции listdir()
и isfile()
модуля os:
- Импортируйте модуль
os
. Этот модуль помогает нам работать с функциональностью Python, зависящей от операционной системы. Модуль os предоставляет функции для взаимодействия с операционной системой. - Используйте функцию
os.listdir()
. Функцияos.listdir('path')
возвращает список, содержащий имена файлов и каталогов, присутствующих в директории, заданной в видеpath
. - Итерация результата. Используйте цикл
for
для перебора файлов, возвращенных функциейlistdir()
. - Используйте функцию
isfile()
. В каждой итерации цикла используйте функциюos.path.isfile('path')
, чтобы проверить, является ли текущий путь файлом или каталогом. Если это файл, то добавьте его в список. Эта функция возвращаетTrue
, если заданный путь является файлом. В противном случае она возвращаетFalse
.
Пример получения списка файлов каталога
Рассмотрим, как перечислить файлы папки account
. Функция listdir()
выводит список файлов только в текущей директории и игнорирует поддиректории.
Вариант 1. Получаем список только файлов, без имен вложенных директорий
import os # folder path dir_path = r'E:\\account\\' # list to store files res = [] # Iterate directory for path in os.listdir(dir_path): # check if current path is a file if os.path.isfile(os.path.join(dir_path, path)): res.append(path) print(res)
Вывод:
['profit.txt', 'sales.txt', 'sample.txt']
Здесь мы получили имена трех файлов.
Если вы знакомы с генераторными выражениями, вы можете сократить и упростить этот код.
Генераторное выражение:
import os def get_files(path): for file in os.listdir(path): if os.path.isfile(os.path.join(path, file)): yield file
Затем просто вызывайте его, когда потребуется.
for file in get_files(r'E:\\account\\'): print(file)
Вариант 2. Получаем как файлы, так и вложенные каталоги
Чтобы получить содержимое каталога, вызовите функцию listdir('path')
непосредственно для этого каталога:
import os # folder path dir_path = r'E:\\account\\' # list file and directories res = os.listdir(dir_path) print(res)
Вывод:
['profit.txt', 'reports_2021', 'sales.txt', 'sample.txt']
Мы получили те же три файла, что и в первом случае, плюс каталог reports_2021
.
Вывод списка всех файлов в каталоге и подкаталогах при помощи os.walk()
Функция os.walk()
возвращает генератор, который создает кортеж значений (current_path, директории в current_path, файлы в current_path).
Примечание: Используя функцию os.walk()
, мы можем перечислить все каталоги, подкаталоги и файлы в заданном каталоге.
Это рекурсивная функция, т.е. при каждом вызове генератора она будет рекурсивно проходить по каждому каталогу, получая список файлов и каталогов до тех пор, пока из начального каталога не останется ни одного подкаталога.
Например, вызов os.walk('path')
даст два списка для каждой директории, которую он посетит. Первый список содержит файлы, а второй – каталоги.
Рассмотрим пример для перечисления всех файлов в каталоге и подкаталогах:
from os import walk # folder path dir_path = r'E:\\account\\' # list to store files name res = [] for (dir_path, dir_names, file_names) in walk(dir_path): res.extend(file_names) print(res)
Вывод:
['profit.txt', 'sales.txt', 'sample.txt', 'december_2021.txt']
Примечание: Добавьте break
внутри цикла, чтобы прекратить рекурсивный поиск файлов в подкаталогах:
from os import walk # folder path dir_path = r'E:\\account\\' res = [] for (dir_path, dir_names, file_names) in walk(dir_path): res.extend(file_names) # don't look inside any subdirectory break print(res)
Использование os.scandir() для получения файлов каталога
Функция scandir()
возвращает записи каталога вместе с информацией об атрибутах файлов, что обеспечивает лучшую производительность для многих распространенных случаев использования.
Эта функция возвращает итератор объектов os.DirEntry
, который содержит имена файлов.
Пример:
import os # get all files inside a specific folder dir_path = r'E:\\account\\' for path in os.scandir(dir_path): if path.is_file(): print(path.name)
Вывод:
profit.txt sales.txt sample.txt
Модуль Glob для вывода списка файлов каталога
Модуль glob
, входящий в состав стандартной библиотеки Python, используется для поиска файлов и папок, имена которых соответствуют определенному шаблону.
Например, чтобы получить все файлы каталога dir_path
, мы будем использовать шаблон dir_path/*.*
. Здесь *.*
означает файл с любым расширением.
Давайте посмотрим, как перечислить файлы из каталога с помощью модуля glob
.
import glob # search all files inside a specific folder # *.* means file name with any extension dir_path = r'E:\account\*.*' res = glob.glob(dir_path) print(res)
Вывод:
['E:\\account\\profit.txt', 'E:\\account\\sales.txt', 'E:\\account\\sample.txt']
Примечание: Если вы хотите перечислить и файлы из подкаталогов, то установите атрибут recursive
в True
.
Пример:
import glob # search all files inside a specific folder # *.* means file name with any extension dir_path = r'E:\demos\files_demos\account\**\*.*' for file in glob.glob(dir_path, recursive=True): print(file)
Вывод:
E:\account\profit.txt E:\account\sales.txt E:\account\sample.txt E:\account\reports_2021\december_2021.txt
Получение списка файлов при помощи модуля pathlib
Начиная с Python 3.4, мы можем использовать модуль pathlib, который предоставляет обертку для большинства функций ОС.
- Импортируйте модуль pathlib. Этот модуль предлагает классы и методы для обработки путей к файловой системе и получения данных, связанных с файлами, для различных операционных систем.
- Затем используйте
pathlib.Path('path')
для построения пути к каталогу - Затем используйте функцию
iterdir()
для перебора всех записей в каталоге - В конце проверьте, является ли текущая запись файлом, используя функцию
path.isfile()
Пример:
import pathlib # folder path dir_path = r'E:\\account\\' # to store file names res = [] # construct path object d = pathlib.Path(dir_path) # iterate directory for entry in d.iterdir(): # check if it a file if entry.is_file(): res.append(entry) print(res)
Перевод статьи Vidhal «Python List Files in a Directory».
Пингбэк: Поиск текста в нескольких файлах на Python - pythonturbo