Как получить список файлов в каталоге в Python

Иногда вам может потребоваться вывести список всех файлов из каталога для обработки. Например, вам может потребоваться найти все изображения в каталоге и изменить размер каждого из них. Чтобы вывести список всех файлов в каталоге, вы можете использовать функцию os.walk().

Функция os.walk() генерирует имена файлов в каталоге, обходя дерево сверху вниз или снизу вверх. Функция os.walk() возвращает кортеж с тремя полями (путь к каталогу, имена каталогов и имена файлов) для каждого каталога в дереве каталогов.

Обратите внимание, что функция os.walk() проверяет все дерево каталогов. Таким образом, вы можете использовать его для получения всех файлов из всех каталогов и подкаталогов корневого каталога.

Содержание

Пример списка файлов в Python

Предположим, у вас есть папка D:\web со следующими каталогами и файлами:

D:\web
├── assets
|  ├── css
|  |  └── style.css
|  └── js
|     └── app.js
├── blog
|  ├── read-file.html
|  └── write-file.html
├── about.html
├── contact.html
└── index.html

В следующем примере показано, как использовать функцию os.walk() для вывода списка всех файлов HTML из каталога D:\web:

import os


path = 'D:\\web'

html_files = []

for dirpath, dirnames, filenames in os.walk(path):
    for filename in filenames:
        if filename.endswith('.html'):
            html_files.append(os.path.join(dirpath, filename))

for html_file in html_files:
    print(html_file)

Выход:

D:\web\about.html
D:\web\contact.html
D:\web\index.html
D:\web\blog\read-file.html
D:\web\blog\write-file.html

Как это работает:

  • Сначала инициализируйте список для хранения пути к файлам HTML:
html_files = []
  • Во-вторых, вызовите функцию os.walk() для проверки каталогов папки D:\web:
for dirpath, dirnames, filenames in os.walk(path):

В пути каталога хранится каталог, а в именах файлов хранятся файлы в этом каталоге.

  • В-третьих, переберите имена файлов и добавьте их в список html_files, если их расширения — .html:
# ...
for filename in filenames:
        if filename.endswith('.html'):
            html_files.append(os.path.join(dirpath, filename))

Обратите внимание, что os.path.join() возвращает полный путь к имени файла, соединяя путь к имени файла.

  • Наконец, выведите имена файлов из списка html_files:
for html_file in html_files:
    print(html_file)

Определение функции многократного использования списка файлов

Используя функцию os.walk(), мы можем определить повторно используемую функцию list_files() следующим образом:

import os


def list_files(path, extentions=None):
    """ List all files in a directory specified by path
    Args:
        path - the root directory path
        extensions - a iterator of file extensions to include, pass None to get all files.
    Returns:
        A list of files specified by extensions
    """
    filepaths = []
    for root, _, files in os.walk(path):
        for file in files:
            if extentions is None:
                filepaths.append(os.path.join(root, file))
            else:
                for ext in extentions:
                    if file.endswith(ext):
                        filepaths.append(os.path.join(root, file))

    return filepaths


if __name__ == '__main__':
    filepaths = list_files(r'D:\web',('.html', '.css'))
    for filepath in filepaths:
        print(filepath)

Выход:

D:\web\about.html
D:\web\contact.html
D:\web\index.html
D:\web\assets\css\style.css
D:\web\blog\read-file.html
D:\web\blog\write-file.html

Сделайте работу списков файлов более эффективной

Если количество файлов небольшое, функция list_files() работает нормально. Однако если количество файлов велико, возврат большого списка файлов неэффективно использует память.

Чтобы решить эту проблему, вы можете использовать генератор для получения каждого файла за раз вместо возврата списка:

import os


def list_files(path, extentions=None):
    """ List all files in a directory specified by path
    Args:
        path - the root directory path
        extensions - a iterator of file extensions to include, pass None to get all files.
    Returns:
        A list of files specified by extensions
    """
    for root, _, files in os.walk(path):
        for file in files:
            if extentions is None:
                yield os.path.join(root, file)
            else:
                for ext in extentions:
                    if file.endswith(ext):
                        yield os.path.join(root, file)


if __name__ == '__main__':
    filepaths = list_files(r'D:\web',('.html', '.css'))
    for filepath in filepaths:
        print(filepath)

Заключение

  • Используйте функцию os.walk() для рекурсивного перечисления файлов в каталоге.
  • Определите функцию многократного использования для вывода списка файлов в каталоге с помощью функции os.walk().
Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *