Python
Быстрое получение списка файлов в каталоге: Практическое руководство на Python

Быстрое получение списка файлов в каталоге: Практическое руководство на Python

MoeNagy Dev

Исследование модулей os и os.path

Обзор модулей os и os.path

Модули os и os.path в Python предоставляют кросс-платформенный способ взаимодействия с файловой системой операционной системы. Эти модули предлагают широкий спектр функциональности, от перечисления файлов в каталоге до управления путями файлов и каталогов.

Получение текущего рабочего каталога

Можно использовать функцию os.getcwd() для получения текущего рабочего каталога:

import os
 
current_dir = os.getcwd()
print(current_dir)

Это выведет абсолютный путь текущего рабочего каталога.

Перечисление файлов в текущем каталоге

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

import os
 
files_and_dirs = os.listdir()
print(files_and_dirs)

Это вернет список всех элементов (файлов и каталогов) в текущем каталоге.

Использование функции os.listdir()

Основы использования функции os.listdir()

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

import os
 
# Перечисление файлов в текущем каталоге
files_and_dirs = os.listdir()
print(files_and_dirs)
 
# Перечисление файлов в указанном каталоге
specific_dir = "/путь/к/каталогу"
files_and_dirs = os.listdir(specific_dir)
print(files_and_dirs)

Перечисление файлов в указанном каталоге

Чтобы перечислить файлы в указанном каталоге, передайте путь к каталогу в качестве аргумента os.listdir():

import os
 
specific_dir = "/путь/к/каталогу"
files_and_dirs = os.listdir(specific_dir)
print(files_and_dirs)

Это вернет список всех элементов (файлов и каталогов) в указанном каталоге.

Работа с относительными и абсолютными путями

Вы можете использовать как относительные, так и абсолютные пути с os.listdir(). Относительные пути интерпретируются относительно текущего рабочего каталога, а абсолютные пути интерпретируются как полный путь к каталогу.

import os
 
# Использование относительного пути
rel_path = "документы"
files_and_dirs = os.listdir(rel_path)
print(files_and_dirs)
 
# Использование абсолютного пути
abs_path = "/домашняя/папка/пользователя/документы"
files_and_dirs = os.listdir(abs_path)
print(files_and_dirs)

Фильтрация списка файлов

Исключение каталогов из списка

Если вы хотите перечислить только файлы в каталоге, а не сами каталоги, вы можете использовать функцию os.path.isfile() для фильтрации списка:

import os
 
directory = "/путь/к/каталогу"
all_items = os.listdir(directory)
files = [item for item in all_items if os.path.isfile(os.path.join(directory, item))]
print(files)

Это создаст новый список files, который будет содержать только имена файлов, исключая любые каталоги.

Фильтрация по расширению файла

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

import os
 
directory = "/путь/к/каталогу"
all_items = os.listdir(directory)
txt_files = [item for item in all_items if item.endswith(".txt")]
print(txt_files)

Это создаст новый список txt_files, который будет содержать только имена файлов с расширением .txt.

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

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

import os
 
directory = "/путь/к/каталогу"
all_items = os.listdir(directory)
large_csv_files = [
    item
    for item in all_items
    if item.endswith(".csv") and os.path.getsize(os.path.join(directory, item)) > 1024 * 1024
]
print(large_csv_files)

Это создаст новый список large_csv_files, который будет содержать только файлы CSV в каталоге размером больше 1 МБ.

Рекурсивное перечисление файлов в подкаталогах

Изучение подкаталогов с помощью функции os.walk()

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

import os
 
directory = "/путь/к/каталогу"
for root, dirs, files in os.walk(directory):
    for file in files:
        print(os.path.join(root, file))

Это выведет полный путь к каждому файлу в дереве каталогов, начиная с указанного directory.

Обработка путей к файлам рекурсивным образом

При работе с os.walk() вам нужно правильно обрабатывать пути к файлам, особенно при работе с подкаталогами. Функцию os.path.join() можно использовать для создания полного пути к файлу путем объединения пути к каталогу и имени файла.

import os
 
directory = "/путь/к/каталогу"
for root, dirs, files in os.walk(directory):
    for file in files:
        full_path = os.path.join(root, file)
        print(full_path)

Это выведет полный путь к каждому файлу, учитывая структуру каталогов.

Настройка формата вывода

Вы можете настроить формат вывода по своему усмотрению. Например, вы можете выводить размер файла и время последнего изменения вместе с путем к файлу:

import os
from datetime import datetime
 
directory = "/путь/к/каталогу"
for root, dirs, files in os.walk(directory):
    for file in files:
        full_path = os.path.join(root, file)
```python
import os
 
file_size = os.path.getsize(full_path)
mod_time = os.path.getmtime(full_path)
mod_time_str = datetime.fromtimestamp(mod_time).strftime("%Y-%m-%d %H:%M:%S")
print(f"{full_path} - Размер: {file_size} байт - Изменено: {mod_time_str}")

Это выведет путь к файлу, размер и время изменения каждого файла в дереве каталогов.

Работа с модулем os.path

Соединение путей с помощью os.path.join()

Функция os.path.join() используется для построения путей к файлам путем объединения одного или нескольких компонентов пути. Она обрабатывает соответствующие разделители пути (например, прямые слэши на системах Unix, обратные слэши на Windows) в зависимости от операционной системы.

import os
 
directory = "/путь/к/каталогу"
filename = "пример.txt"
full_path = os.path.join(directory, filename)
print(full_path)

Это выведет полный путь к файлу с соответствующими разделителями пути для текущей операционной системы.

Проверка, является ли путь файлом или каталогом

Функции os.path.isfile() и os.path.isdir() могут быть использованы для проверки, представляет ли указанный путь файл или каталог соответственно.

import os
 
path = "/путь/к/файлу.txt"
if os.path.isfile(path):
    print(f"{path} является файлом.")
else:
    print(f"{path} не является файлом.")
 
path = "/путь/к/каталогу"
if os.path.isdir(path):
    print(f"{path} является каталогом.")
else:
    print(f"{path} не является каталогом.")

Получение размера файла и времени последнего изменения

Функции os.path.getsize() и os.path.getmtime() могут быть использованы для получения размера файла и времени его последнего изменения соответственно.

import os
from datetime import datetime
 
path = "/путь/к/файлу.txt"
file_size = os.path.getsize(path)
mod_time = os.path.getmtime(path)
mod_time_str = datetime.fromtimestamp(mod_time).strftime("%Y-%m-%d %H:%M:%S")
print(f"Размер файла: {file_size} байт")
print(f"Последнее изменение: {mod_time_str}")

Это выведет размер файла в байтах и время последнего изменения файла.

Обеспечение совместимости с различными платформами

Учет различий между операционными системами

Модули os и os.path разработаны для предоставления платформенно-независимого интерфейса, однако все же имеются некоторые различия в обработке путей к файлам на разных операционных системах (например, Windows использует обратные слэши, а системы, основанные на Unix, используют прямые слэши).

Обеспечение последовательности работы на разных платформах

Для обеспечения работы ваш кодов последовательной между разными платформами, следует использовать соответствующие функции и методы из модуля os.path, такие как os.path.join(), os.path.normpath() и os.path.normcase().

Использование функций os.path.normpath() и os.path.normcase()

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

import os
 
# Нормализация пути
path = "/путь/к/../../файлу.txt"
normalized_path = os.path.normpath(path)
print(normalized_path)  # Выход: "/путь/файлу.txt"
 
# Нормализация регистра пути
path = "/ПУТЬ/К/ФАЙЛУ.txt"
normalized_path = os.path.normcase(path)
print(normalized_path)  # Выход: "/путь/к/файлу.txt" (на системах, основанных на Unix)

Используя эти функции, вы можете обеспечить, что ваши пути к файлам будут однородно отформатированы на разных операционных системах.

Сортировка и организация списка файлов

Сортировка списка файлов по имени, размеру или времени изменения

Вы можете сортировать список файлов по различным атрибутам, таким как имя файла, размер или время изменения. Для этой цели можно использовать функцию sorted() вместе с соответствующими функциями ключей.

import os
 
directory = "/путь/к/каталогу"
files = os.listdir(directory)
 
# Сортировка по имени файла
sorted_files = sorted(files)
print(sorted_files)
 
# Сортировка по размеру файла
file_sizes = [(f, os.path.getsize(os.path.join(directory, f))) for f in files]
sorted_files = sorted(file_sizes, key=lambda x: x[1])
print(sorted_files)
 
# Сортировка по времени изменения
file_mod_times = [(f, os.path.getmtime(os.path.join(directory, f))) for f in files]
sorted_files = sorted(file_mod_times, key=lambda x: x[1])
print(sorted_files)

Это выведет список файлов, отсортированных по имени, размеру и времени изменения соответственно.

Группировка файлов по расширению или другим атрибутам

Вы можете группировать файлы по их расширению или другим атрибутам с помощью словаря или defaultdict:

import os
from collections import defaultdict
 
directory = "/путь/к/каталогу"
files = os.listdir(directory)
 
# Группировка файлов по расширению
file_groups = defaultdict(list)
for file in files:
    extension = os.path.splitext(file)[1][1:]
    file_groups[extension].append(file)
 
for extension, files in file_groups.items():
    print(f"Файлы с расширением {extension}: {', '.join(files)}")
 
# Группировка файлов по размеру (в мегабайтах)
file_sizes = [(f, os.path.getsize(os.path.join(directory, f))) for f in files]
file_groups = defaultdict(list)
for file, size in file_sizes:
    size_mb = size / (1024 * 1024)
    file_groups[f"{size_mb:.2f} МБ"].append(file)
 
for size, files in file_groups.items():
    print(f"Файлы размером {size}: {', '.join(files)}")

Это группирует файлы по

Кортежи

Кортежи похожи на списки, но они неизменяемы, что означает, что вы не можете изменять их элементы после их создания. Кортежи определяются с использованием круглых скобок () вместо квадратных скобок [].

my_tuple = (1, 'яблоко', 3.14, True)
print(my_tuple[0])  # Вывод: 1

Кортежи полезны, когда вы хотите обеспечить сохранение порядка и содержимого коллекции данных.

Словари

Словари - это неупорядоченные коллекции пар ключ-значение. Они определяются с использованием фигурных скобок {}, и каждая пара ключ-значение разделяется двоеточием :.

my_dict = {'name': 'John', 'age': 30, 'city': 'New York'}
print(my_dict['name'])  # Вывод: 'John'

Вы можете добавлять, изменять и удалять пары ключ-значение в словаре:

my_dict['email'] = 'john@example.com'
my_dict['age'] = 31
del my_dict['city']

Словари мощны для хранения и извлечения данных на основе уникальных ключей.

Множества

Множества - это неупорядоченные коллекции уникальных элементов. Они определяются с использованием фигурных скобок {} или функции set().

my_set = {1, 2, 3, 4, 5}
print(2 in my_set)  # Вывод: True
print(6 in my_set)  # Вывод: False

Множества полезны для выполнения операций, таких как объединение, пересечение и разность между коллекциями данных.

Управление потоком выполнения

Условные операторы

Условные операторы в Python используют ключевые слова if, elif и else, чтобы выполнять разные блоки кода в зависимости от определенных условий.

x = 10
if x > 0:
    print("x положительное")
elif x < 0:
    print("x отрицательное")
else:
    print("x равно нулю")

Циклы

В Python есть две основные структуры циклов: for и while. Цикл for используется для итерации по последовательностям (таким как списки, кортежи или строки), а цикл while используется для выполнения блока кода до тех пор, пока определенное условие истинно.

# Цикл for
fruits = ['яблоко', 'банан', 'вишня']
for fruit in fruits:
    print(fruit)
 
# Цикл while
count = 0
while count < 5:
    print(count)
    count += 1

Вы также можете использовать операторы break и continue, чтобы контролировать поток выполнения цикла.

Списковые включения

Списковые включения предоставляют краткий способ создания новых списков на основе существующих. Они особенно полезны для преобразования или фильтрации данных.

# Создание нового списка с квадратами чисел от 1 до 10
squares = [x**2 for x in range(1, 11)]
print(squares)  # Вывод: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
 
# Создание нового списка с четными числами от 1 до 10
even_numbers = [x for x in range(1, 11) if x % 2 == 0]
print(even_numbers)  # Вывод: [2, 4, 6, 8, 10]

Функции

Функции в Python определяются с использованием ключевого слова def. Они могут принимать параметры и возвращать значения.

def greet(name):
    """Приветствуйте человека с заданным именем."""
    print(f"Привет, {name}!")
 
greet("Alice")  # Вывод: Привет, Alice!

Вы также можете определить функции с значениями параметров по умолчанию и аргументами переменной длины.

def calculate_area(length, width=1):
    """Вычислить площадь прямоугольника."""
    return length * width
 
print(calculate_area(5, 3))  # Вывод: 15
print(calculate_area(4))  # Вывод: 4 (ширина по умолчанию равна 1)
 
def sum_numbers(*args):
    """Вычислить сумму любого количества аргументов."""
    return sum(args)
 
print(sum_numbers(1, 2, 3))  # Вывод: 6
print(sum_numbers(4, 5, 6, 7, 8))  # Вывод: 30

Функции также могут быть определены как лямбда-функции (анонимные функции) для выполнения простых однострочных операций.

квадрат = lambda x: x**2
print(квадрат(5))  # Вывод: 25

Модули и пакеты

Стандартная библиотека Python предоставляет широкий спектр встроенных модулей, которые вы можете использовать в своих программах. Вы также можете создавать собственные модули и пакеты для организации своего кода.

# Использование встроенного модуля
import math
print(math.pi)  # Вывод: 3.141592653589793
 
# Создание собственного модуля
# my_module.py
def greet(name):
    print(f"Привет, {name}!")
 
# Использование собственного модуля
import my_module
my_module.greet("Alice")  # Вывод: Привет, Alice!

Пакеты представляют собой наборы модулей, и они помогают вам структурировать свой код и управлять зависимостями.

Обработка исключений

Механизм обработки исключений в Python позволяет вам обрабатывать ошибки и неожиданные ситуации в вашем коде.

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Ошибка: деление на ноль")
else:
    print(f"Результат: {result}")
finally:
    print("Этот блок будет выполнен всегда.")

Вы также можете определить собственные исключения и вызывать их при необходимости.

class InvalidInputError(Exception):
    pass
 
def divide(a, b):
    if b == 0:
        raise InvalidInputError("Ошибка: деление на ноль")
    return a / b
 
try:
    print(divide(10, 0))
except InvalidInputError as e:
    print(e)

Ввод-вывод файлов

Python предоставляет встроенные функции для чтения из файлов и записи в файлы.

# Запись в файл
with open("output.txt", "w") as file:
    file.write("Привет, мир!")
 
# Чтение из файла
with open("input.txt", "r") as file:
    content = file.read()
    print(content)

Оператор with гарантирует, что файл будет правильно закрыт после завершения операции.

Заключение

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

MoeNagy Dev