Python Programming

Эффективная выборка файлов из директорий в Python

Spread the love

Эффективное извлечение всех файлов в каталоге является важной задачей во многих Python-программах, особенно тех, которые связаны с манипуляциями файловой системой, обработкой данных или автоматизацией. Python предоставляет несколько надежных методов для решения этой задачи, каждый со своими преимуществами и недостатками. В этой статье рассматриваются три популярных подхода: os.listdir, os.walk и glob.glob, которые помогут вам выбрать наиболее подходящий метод для ваших конкретных нужд.

Содержание

os.listdir: Список файлов в одном каталоге

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


import os

def list_directory_files(directory):
  """Выводит список всех файлов и каталогов в заданном каталоге.

  Args:
    directory: Путь к каталогу.

  Returns:
    Список имен файлов (строки) и имен каталогов в указанном каталоге. 
    Возвращает пустой список, если каталог пуст или не существует.  
    Выводит сообщение об ошибке, если каталог не найден.
  """
  try:
    return os.listdir(directory)
  except FileNotFoundError:
    print(f"Ошибка: Каталог '{directory}' не найден.")
    return []

my_directory = "/path/to/your/directory"  # Замените на путь к вашему каталогу
files_and_dirs = list_directory_files(my_directory)
print(files_and_dirs)

Преимущества: Простота и эффективность для списков одного каталога.

Недостатки: Не выполняет рекурсивный обход подкаталогов; предоставляет только имена файлов, а не полные пути.

os.walk: Рекурсивный обход каталогов

Для рекурсивного исследования каталогов и их подкаталогов os.walk() является идеальным выбором. Он выдает 3-кортеж для каждого каталога: (root, dirs, files). root — это путь к текущему каталогу, dirs — это список имен подкаталогов, а files — список имен файлов в этом каталоге.


import os

def get_all_files(directory):
  """Рекурсивно извлекает все файлы в каталоге и его подкаталогах.

  Args:
    directory: Путь к каталогу.

  Returns:
    Список полных путей к файлам (строки). Возвращает пустой список, если каталог пуст или не существует.
    Выводит сообщение об ошибке, если каталог не найден.
  """
  all_files = []
  try:
    for root, _, files in os.walk(directory):
      for file in files:
        all_files.append(os.path.join(root, file))
    return all_files
  except FileNotFoundError:
    print(f"Ошибка: Каталог '{directory}' не найден.")
    return []

my_directory = "/path/to/your/directory"  # Замените на путь к вашему каталогу
all_files = get_all_files(my_directory)
print(all_files)

Преимущества: Рекурсивно обходит подкаталоги, предоставляя полные пути к файлам.

Недостатки: Немного сложнее, чем os.listdir().

glob.glob: Выбор файлов по шаблону

Функция glob.glob() предлагает гибкое сопоставление имен файлов с использованием подстановочных знаков в стиле shell. Это особенно полезно для выбора файлов на основе определенных шаблонов (например, всех файлов .txt, файлов, начинающихся с «report_»).


import glob
import os

def get_files_by_pattern(directory, pattern="*"):
    """Извлекает файлы, соответствующие шаблону, в каталоге.

    Args:
      directory: Путь к каталогу.
      pattern: Шаблон имени файла (по умолчанию "*", соответствует всем файлам).

    Returns:
      Список полных путей к файлам (строки), соответствующих шаблону.  
      Возвращает пустой список, если файлы не найдены или каталог не существует.
      Выводит сообщение об ошибке, если каталог не найден.
    """
    try:
        return glob.glob(os.path.join(directory, pattern))
    except FileNotFoundError:
        print(f"Ошибка: Каталог '{directory}' не найден.")
        return []

my_directory = "/path/to/your/directory"  # Замените на путь к вашему каталогу
txt_files = get_files_by_pattern(my_directory, "*.txt")
print(txt_files)
all_files = get_files_by_pattern(my_directory)
print(all_files)

Преимущества: Мощные возможности сопоставления по шаблонам.

Недостатки: Менее очевиден, чем os.listdir() для простых списков; не выполняет рекурсивный обход подкаталогов, если не используется в сочетании с os.walk().

Выбор правильного метода

Оптимальный метод зависит от ваших конкретных требований:

  • Для простых списков одного каталога достаточно os.listdir().
  • Для рекурсивного обхода каталогов и подкаталогов наилучшим выбором является os.walk().
  • Для выборочного извлечения файлов с использованием шаблонов glob.glob() обеспечивает наиболее эффективное решение.

Не забудьте включить соответствующую обработку ошибок (например, FileNotFoundError) для надежного кода.

Добавить комментарий

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