Python
Как легко получить все файлы в директории с помощью Python: руководство для начинающих

Как легко получить все файлы в директории с помощью Python: руководство для начинающих

MoeNagy Dev

Понимание путей к файлам

Абсолютные и относительные пути

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

Вот пример использования абсолютных и относительных путей в Python:

# Абсолютный путь
absolute_path = "/Users/username/documents/file.txt"
 
# Относительный путь
relative_path = "documents/file.txt"

Вы можете использовать функцию os.path.abspath() для преобразования относительного пути в абсолютный путь:

import os
 
relative_path = "documents/file.txt"
absolute_path = os.path.abspath(relative_path)
print(absolute_path)
# Вывод: /Users/username/documents/file.txt

Навигация по файловой системе с помощью Python

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

  • os.getcwd(): Возвращает текущую рабочую директорию.
  • os.chdir(path): Изменяет текущую рабочую директорию на указанный путь.
  • os.path.join(path1, path2, ...): Интеллектуально объединяет один или несколько компонентов пути.
  • os.path.dirname(path): Возвращает имя директории указанного пути.
  • os.path.basename(path): Возвращает базовое имя указанного пути.

Пример:

import os
 
# Получить текущую рабочую директорию
current_dir = os.getcwd()
print(current_dir)
 
# Изменить текущую рабочую директорию
os.chdir("/Users/username/documents")
new_dir = os.getcwd()
print(new_dir)
 
# Объединение путей
file_path = os.path.join(new_dir, "file.txt")
print(file_path)
 
# Получение имени директории и базового имени
dir_name = os.path.dirname(file_path)
base_name = os.path.basename(file_path)
print(dir_name)
print(base_name)

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

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

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

Пример:

import os
 
# Получение списка файлов и директорий в текущей директории
items = os.listdir(".")
print(items)

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

Вы можете отфильтровать список файлов и директорий, проверяя тип каждого элемента с помощью функций os.path.isfile() и os.path.isdir().

Пример:

import os
 
# Получение списка файлов и директорий в текущей директории
items = os.listdir(".")
 
# Отфильтровать список, чтобы получить только файлы
files = [item for item in items if os.path.isfile(item)]
print(files)
 
# Отфильтровать список, чтобы получить только директории
directories = [item for item in items if os.path.isdir(item)]
print(directories)

Работа с поддиректориями

Рекурсивное обход поддиректорий

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

Пример:

import os
 
def get_all_files(directory):
    all_files = []
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            all_files.append(item_path)
        elif os.path.isdir(item_path):
            all_files.extend(get_all_files(item_path))
    return all_files
 
# Получение всех файлов в текущей директории и поддиректориях
all_files = get_all_files(".")
print(all_files)

Определение директорий и файлов

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

Пример:

import os
 
# Проверка, является ли путь файлом
if os.path.isfile("file.txt"):
    print("Это файл!")
else:
    print("Это не файл.")
 
# Проверка, является ли путь директорией
if os.path.isdir("documents"):
    print("Это директория!")
else:
    print("Это не директория.")

Работа с функцией os.walk()

Изучение функции os.walk()

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

  1. Корневая директория
  2. Список имен поддиректорий в root (исключая '.' и '..')
  3. Список имен файлов, не являющихся директориями, в root

Пример:

import os
 
for root, dirs, files in os.walk("."):
    print(f"Корневая директория: {root}")
    print(f"Поддиректории: {dirs}")
    print(f"Файлы: {files}")
    print()

Настройка поведения os.walk()

Вы можете настроить поведение os.walk() с помощью дополнительных аргументов:

  • topdown: Если True, os.walk() посещает директории в порядке их появления в дереве директорий (по умолчанию - True).
  • onerror: Функция, которая вызывается при возникновении ошибки os.walk(). Функция должна принимать один аргумент - экземпляр OSError.
  • followlinks: Если True, os.walk() будет следовать символическим ссылкам (по умолчанию - False).

Пример:

import os
 
for root, dirs, files in os.walk(".", topdown=False, onerror=lambda err: print(f"Ошибка: {err}"), followlinks=True):
    print(f"Корневая директория: {root}")
    print(f"Поддиректории: {dirs}")
    print(f"Файлы: {files}")
    print()

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

Проверка расширения файла

Вы можете проверить расширение файла с помощью функции os.path.splitext(), которая возвращает кортеж из корня и расширения пути.

Пример:

import os
 
file_path = "documents/file.txt"
root, ext = os.path.splitext(file_path)
print(f"Root: {root}")
print(f"Extension: {ext}")

Создание списка файлов с определенным расширением

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

Пример:

import os
 
def get_files_by_extension(directory, extension):
    all_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                file_path = os.path.join(root, file)
                all_files.append(file_path)
    return all_files
 
# Получите все файлы .txt в текущем каталоге и подкаталогах
txt_files = get_files_by_extension(".", ".txt")
print(txt_files)

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

Сортировка списка файлов

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

Пример:

import os
 
# Получите список файлов в текущем каталоге
files = os.listdir(".")
 
# Отсортируйте файлы по имени
sorted_files = sorted(files)
print(sorted_files)
 
# Отсортируйте файлы по размеру
file_sizes = [(file, os.path.getsize(file)) for file in files]
sorted_by_size = sorted(file_sizes, key=lambda x: x[1])
print(sorted_by_size)

Группировка файлов по расширению

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

Пример:

import os
from collections import defaultdict
 
def group_files_by_extension(directory):
    file_groups = defaultdict(list)
    for root, dirs, files in os.walk(directory):
        for file in files:
            _, ext = os.path.splitext(file)
            file_path = os.path.join(root, file)
            file_groups[ext].append(file_path)
    return file_groups
 
# Группируйте файлы в текущем каталоге и подкаталогах
file_groups = group_files_by_extension(".")
for extension, files in file_groups.items():
    print(f"{extension}: {files}")

Обработка ошибок и крайних случаев

Работа с разрешениями и проблемами доступа

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

Пример:

import os
 
def get_file_info(file_path):
    try:
        file_size = os.path.getsize(file_path)
        last_modified = os.path.getmtime(file_path)
        return file_size, last_modified
    except OSError as e:
        print(f"Ошибка при доступе к файлу {file_path}: {e}")
        return None, None
 
# Получите информацию о файле для файла
file_info = get_file_info("file.txt")
if file_info[0] is not None:
    file_size, last_modified = file_info
    print(f"Размер файла: {file_size} байт")
    print(f"Последнее изменение: {last_modified}")

Обработка символических ссылок и других специальных файлов

Модули os и os.path в Python позволяют работать с различными типами специальных файлов, такими как символические ссылки, именованные каналы и файлы устройств. Вы можете использовать функцию os.path.islink(), чтобы проверить, является ли файл символической ссылкой.

Пример:

import os
 
def handle_special_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if os.path.islink(file_path):
                print(f"Символическая ссылка: {file_path}")
            elif os.path.isfifo(file_path):
                print(f"Именованный канал: {file_path}")
            elif os.path.isdev(file_path):
                print(f"Файл устройства: {file_path}")
            else:
                print(f"Обычный файл: {file_path}")
 
# Обработка специальных файлов в текущем каталоге и подкаталогах
handle_special_files(".")

Структуры данных

Списки

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

Вот пример создания списка и выполнения некоторых общих операций:

# Создание списка
fruits = ['яблоко', 'банан', 'вишня']
 
# Доступ к элементам
print(fruits[0])  # Вывод: 'яблоко'
print(fruits[-1])  # Вывод: 'вишня'
 
# Добавление элементов
fruits.append('апельсин')
print(fruits)  # Вывод: ['яблоко', 'банан', 'вишня', 'апельсин']
 
# Удаление элементов
fruits.remove('банан')
print(fruits)  # Вывод: ['яблоко', 'вишня', 'апельсин']
 
# Диапазон
print(fruits[1:3])  # Вывод: ['вишня', 'апельсин']

Кортежи

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

# Создание кортежа
point = (2, 3)
print(point)  # Вывод: (2, 3)
 
# Доступ к элементам
print(point[0])  # Вывод: 2
print(point[1])  # Вывод: 3
 
# Распаковка кортежа
x, y = point
print(x)  # Вывод: 2
print(y)  # Вывод: 3

Словари

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

# Создание словаря
person = {
    'имя': 'Иван Иванов',
    'возраст': 30,
    'город': 'Москва'
}
 
# Доступ к значениям
print(person['имя'])  # Вывод: 'Иван Иванов'
print(person['возраст'])  # Вывод: 30
 
# Добавление и изменение записей
person['email'] = 'ivan.ivanov@example.com'
person['возраст'] = 31
print(person)  # Вывод: {'имя': 'Иван Иванов', 'возраст': 31, 'город': 'Москва', 'email': 'ivan.ivanov@example.com'}
 
# Перебор словаря
for key, value in person.items():
    print(f"{key}: {value}")

Множества

Русский перевод содержимого файла:

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

# Создание набора
colors = {'red', 'green', 'blue'}
print(colors)  # Вывод: {'red', 'green', 'blue'}
 
# Добавление и удаление элементов
colors.add('yellow')
colors.remove('green')
print(colors)  # Вывод: {'red', 'blue', 'yellow'}
 
# Операции с наборами
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1 | set2)  # Объединение: {1, 2, 3, 4}
print(set1 & set2)  # Пересечение: {2, 3}
print(set1 - set2)  # Разность: {1}

Управляющие структуры

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

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

# Условный оператор if-else
age = 18
if age >= 18:
    print("Вы совершеннолетний.")
else:
    print("Вы несовершеннолетний.")
 
# Условный оператор if-elif-else
score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("D")

Циклы

Циклы, такие как for и while, позволяют повторно выполнять блок кода.

# Цикл for
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# Цикл while
count = 0
while count < 5:
    print(count)
    count += 1

Генераторы списков

Генераторы списков позволяют создавать новые списки на основе существующих.

# Генератор списка
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
print(squares)  # Вывод: [1, 4, 9, 16, 25]
 
# Условный генератор списка
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # Вывод: [2, 4]

Функции

Функции - это повторно используемые блоки кода, выполняющие определенную задачу. Они могут принимать аргументы, возвращать значения и помогать организовывать ваш код.

# Определение функции
def greet(name):
    print(f"Привет, {name}!")
 
# Вызов функции
greet("Alice")  # Вывод: Привет, Alice!
 
# Функции с возвращаемыми значениями
def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # Вывод: 7

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

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

# Импорт модуля
import math
print(math.pi)  # Вывод: 3.141592653589793
 
# Импорт конкретных функций из модуля
from math import sqrt, floor
print(sqrt(16))  # Вывод: 4.0
print(floor(3.7))  # Вывод: 3
 
# Импорт пакета
import datetime
print(datetime.datetime.now())  # Вывод: 2023-04-24 12:34:56.789012

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

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

# Обработка исключений
try:
    result = 10 / 0
except ZeroDivisionError:
    print("Ошибка: Деление на ноль.")
 
# Обработка нескольких исключений
try:
    int('abc')
except ValueError:
    print("Ошибка: Недопустимый формат целого числа.")

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

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

# Запись в файл
with open('example.txt', 'w') as file:
    file.write("Привет, Мир!")
 
# Чтение из файла
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)  # Вывод: Привет, Мир!

Заключение

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

MoeNagy Dev