В этой статье мы рассмотрим, как получить список файлов в каталоге при помощи 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