Хотите узнать, как составить список файлов в каталоге с помощью Python? В этой статье вы увидите, как это сделать 4 разными способами, чтобы вы могли выбрать тот, который вам больше нравится.
Во всех примерах мы будем перечислять файлы в каталоге со следующей структурой. Назовем каталог test_dir:
├── data
│ └── tech.txt
└── report.txt
1 directory, 2 files
Давайте начнем!
Как составить список файлов в каталоге с помощью Python os.listdir()
Модуль Python OS позволяет выполнять задачи операционной системы. Этот модуль поставляется с различными функциями, которые можно использовать для создания, удаления и извлечения файлов и каталогов. Модуль OS имеет функцию listdir()
, которая позволяет перечислять файлы и подкаталоги в каталоге.
Вот пример:
import os
directory = '/opt/codefathertech/test_dir/'
file_paths = os.listdir(directory)
print(file_paths)
После импорта модуля ОС мы задаем путь к нашему каталогу и передаем его функции listdir()
, которая выводит список всех файлов, имеющихся в каталоге.
Обратите внимание, что функция listdir()
возвращает список файлов и подкаталогов в каталоге, который мы ей передали, но она не выводит список файлов в каких-либо подкаталогах.
На самом деле, как вы можете видеть, вывод ниже не включает файл tech.txt внутри каталога данных:
['report.txt', 'data']
Примечание: если вы используете Windows, вы можете установить значение переменной каталога на основе расположения каталога test_dir на вашем компьютере.
Давайте добавим следующий оператор Python перед последней функцией print()
, чтобы показать тип переменной file_paths.
print(type(file_paths))
При запуске программы вы увидите в выводе следующее, показывающее, что переменная file_paths представляет собой список Python.
<class 'list'>
Из выходных данных os.listdir()
мы не узнаем, является ли данный элемент списка, возвращаемого listdir()
, файлом или каталогом, без выполнения каких-либо дополнительных проверок.
Как работает функция Python os.walk()?
Чтобы увидеть список файлов во всех подкаталогах, мы можем использовать другой подход, основанный на функции walk()
модуля ОС. Эта функция рекурсивно перечисляет файлы и подкаталоги.
Прежде чем использовать os.walk()
для получения списка файлов в нашем тестовом каталоге, давайте откроем оболочку Python, чтобы понять, как работает os.walk()
.
>>> import os
>>> dir_content = os.walk('.')
>>> dir_content
<generator object walk at 0x7fd09008c430>
Когда мы передаем текущий каталог (обозначенный точкой) в os.walk
, мы получаем обратно объект-генератор.
Давайте узнаем больше об объекте-генераторе, используя функцию next()
.
>>> next(dir_content)
('.', ['data'], ['report.txt'])
Теперь мы видим, что os.walk()
возвращает кортеж Python, где первый элемент — это текущий каталог, второй элемент — это список подкаталогов в переданном ему каталоге, а третий элемент — это список файлов в этом каталоге.
Давайте снова вызовем функцию next()
…
>>> next(dir_content)
('./data', [], ['tech.txt'])
Функция os.walk()
обходит каталог сверху вниз, поэтому, когда мы вызываем функцию next() во второй раз, мы применяем ее к подкаталогу data.
Если вы снова вызовете next()
, вы получите исключение StopIteration, поскольку в объекте генератора больше нет значений, учитывая, что подкаталог data не содержит никаких подкаталогов.
>>> next(dir_content)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
Как рекурсивно перечислить файлы в каталоге с помощью Python os.walk()
Теперь, когда мы понимаем, как работает os.walk()
, давайте напишем код для получения списка всех файлов в нашем тестовом каталоге.
import os
directory = '/opt/codefathertech/test_dir/'
file_paths = []
for dir_path, dirs, files in os.walk(directory):
file_paths.extend([os.path.join(dir_path, file) for file in files])
print(file_paths)
Вывод:
['/opt/codefathertech/test_dir/report.txt', '/opt/codefathertech/test_dir/data/tech.txt']
В приведенном выше примере мы использовали три новые переменные:
- dir_path – используется для хранения каталога, возвращаемого объектом генератора (вспомните, что мы видели в предыдущем разделе об
os.walk()
). - dirs – используется для хранения подкаталогов, возвращаемых объектом генератора.
- files – используются для хранения файлов, возвращаемых объектом генератора.
Функция os.path.join()
возвращает полный путь к указанному файлу путем присоединения пути к каталогу к имени файла.
Мы также используем списковое включение внутри цикла for.
Как использовать модуль Python Glob для вывода списка файлов в каталоге
Модуль glob может возвращать путь к файлам, которые соответствуют определенному шаблону. Этот модуль также позволяет перечислять файлы в каталоге. Этот модуль использует подстановочные знаки для поиска файлов.
Например, если мы хотим перечислить только текстовые файлы, то мы используем подстановочный знак (.txt).
Давайте рассмотрим пример.
import glob
directory = '/opt/codefathertech/test_dir/*'
file_paths = glob.glob(directory)
print(file_paths)
После импорта модуля glob мы указали путь к каталогу, мы используем подстановочный знак (*), что означает поиск всех файлов и каталогов.
Затем мы передаем его в функцию glob.glob:
['/opt/codefathertech/test_dir/report.txt', '/opt/codefathertech/test_dir/data']
Если вы хотите сопоставить только файлы.txt, вы можете обновить строку ниже:
directory = '/opt/codefathertech/test_dir/*.txt'
Преимущество использования модуля Python glob для составления списка файлов в каталоге заключается в том, что этот подход автоматически включает полный путь к каждому файлу.
Этого не было в предыдущих примерах, которые мы видели с os.listdir()
и os.walk()
.
Использование модуля Python Glob для рекурсивного отображения файлов в каталоге
В выводе программы, которую мы создали в конце предыдущего раздела, вы не можете увидеть файл tech.txt внутри каталога данных. Чтобы сделать это, вам нужно перечислить файлы рекурсивно.
Чтобы рекурсивно перечислить файлы в каталоге с помощью модуля Python glob, необходимо передать аргумент recursive функции glob.glob() и установить его в значение True. По умолчанию аргумент recursive равен False. Также необходимо использовать двойную звездочку в используемом шаблоне.
Обновить предыдущий код…
Мы внесем два изменения:
- Замените звездочку в конце переменной каталога на двойную звездочку (**).
- Передайте дополнительный аргумент в функцию
glob(recursive=True)
.
import glob
directory = '/opt/codefathertech/test_dir/**'
file_paths = glob.glob(directory, recursive=True)
print(file_paths)
И вот как меняется вывод:
['/opt/codefathertech/test_dir/', '/opt/codefathertech/test_dir/report.txt', '/opt/codefathertech/test_dir/data', '/opt/codefathertech/test_dir/data/tech.txt']
Намного лучше!
Двойная звездочка, которую мы используем в шаблоне каталога, переданном функции glob()
, применима только в том случае, если recursive имеет значение True.
Использование модуля Python PathLib для вывода списка файлов в каталоге
PathLib — еще один модуль Python, предоставляющий мощные функции для работы с файлами.
Мы будем использовать класс Path() для определения пути к каталогу, а затем использовать iterdir()
для итерации по каталогу.
Затем мы используем метод is_file()
, чтобы проверить, имеем ли мы дело с файлом или нет.
Давайте реализуем это…
import pathlib
directory = '/opt/codefathertech/test_dir/'
file_paths = []
for file in pathlib.Path(directory).iterdir():
if file.is_file():
file_paths.append(file)
print(file_paths)
И вот что получается:
[PosixPath('/opt/codefathertech/test_dir/report.txt')]
Обратите внимание, что код выше перечисляет только файлы в текущем каталоге. Он не проходит через подкаталоги.
Чтобы вывести список файлов в текущем каталоге и подкаталоге, измените код выше, сделав его рекурсивным.
Давайте рассмотрим пример:
from pathlib import Path
directory = Path('/opt/codefathertech/test_dir/')
file_paths = []
for file in directory.rglob('*'):
if file.is_file():
file_paths.append(str(file))
print(file_paths)
Обратите внимание, что в этом коде мы использовали конструкцию «from pathlib import Path
». Подробнее об этом вы узнаете в конце статьи.
На этот раз в выводе вы также видите файл tech.txt в подкаталоге data.
['/opt/codefathertech/test_dir/report.txt', '/opt/codefathertech/test_dir/data/tech.txt']
В Python glob.glob()
— это функция, которая возвращает список путей к файлам, соответствующих заданному шаблону. Функция rglob()
похожа, но она ищет совпадения рекурсивно во всех каталогах по указанному пути.
На выходе мы также получаем файл tech.txt в каталоге данных, поскольку мы используем функцию rglob()
.
Попробуйте обновить предыдущий код, заменив rglob('*')
на glob('*')
и убедитесь, что в выводе вы видите только файл report.txt. Другими словами, поведение больше не рекурсивное.
Заключение
В этой статье вы узнали, как составить список файлов в каталоге с помощью Python.
Мы рассмотрели различные способы составления списка файлов с примерами использования модулей OS, Glob и Pathlib.