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

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

MoeNagy Dev

Исследование списка всех файлов в каталоге Python

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

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

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

Определение текущего рабочего каталога с использованием модуля os

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

import os
 
current_dir = os.getcwd()
print(f"Текущий рабочий каталог: {current_dir}")

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

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

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

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

import os
 
files_and_dirs = os.listdir()
print(f"Содержимое текущего каталога: {files_and_dirs}")

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

Обработка пустых каталогов

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

import os
 
files_and_dirs = os.listdir()
if not files_and_dirs:
    print("Текущий каталог пуст.")
else:
    print(f"Содержимое текущего каталога: {files_and_dirs}")

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

Если вы хотите, чтобы список файлов был отсортирован, вы можете использовать функцию sorted():

import os
 
files_and_dirs = sorted(os.listdir())
print(f"Отсортированное содержимое текущего каталога: {files_and_dirs}")

Это вернет список файлов и каталогов в алфавитном порядке.

Обработка подкаталогов

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

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

import os
 
def list_all_files(directory):
    """
    Рекурсивно обходит каталог и его подкаталоги,
    возвращая список всех файлов.
    """
    file_list = []
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            file_list.append(item_path)
        elif os.path.isdir(item_path):
            file_list.extend(list_all_files(item_path))
    return file_list
 
# Пример использования
all_files = list_all_files(os.getcwd())
print(f"Все файлы в каталоге и подкаталогах: {all_files}")

Эта функция list_all_files() принимает путь каталога в качестве входного параметра и возвращает список всех файлов в этом каталоге и его подкаталогах.

Различение файлов и каталогов

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

import os
 
for item in os.listdir(os.getcwd()):
    item_path = os.path.join(os.getcwd(), item)
    if os.path.isfile(item_path):
        print(f"{item} - это файл.")
    elif os.path.isdir(item_path):
        print(f"{item} - это каталог.")
    else:
        print(f"{item} - это неизвестный тип.")

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

Обработка скрытых файлов и каталогов

По умолчанию os.listdir() будет включать скрытые файлы и каталоги (те, которые начинаются с точки, например .hidden_file.txt или .hidden_directory/). Если вы хотите их исключить, вы можете отфильтровать их:

import os
 
all_items = os.listdir(os.getcwd())
visible_items = [item for item in all_items if not item.startswith(".")]
print(f"Видимые файлы и каталоги: {visible_items}")

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

Работа с путями к файлам

Формирование полных путей к файлам

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

import os
 
directory = os.getcwd()
filename = "example.txt"
full_path = os.path.join(directory, filename)
print(f"Полный путь к файлу: {full_path}")

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

Соединение имен каталогов и файлов

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

import os
 
directory1 = "documents"
directory2 = "reports"
filename = "report.pdf"
full_path = os.path.join(directory1, directory2, filename)
print(f"Полный путь к файлу: {full_path}")

Это создаст путь "documents/reports/report.pdf".

Нормализация путей к файлам

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

import os
 
messy_path = "documents/./reports/../images/image.jpg"
normalized_path = os.path.normpath(messy_path)
print(f"Нормализованный путь: {normalized_path}")

Это выведет "документы / изображения / изображение.jpg", удалив ненужные элементы . и ...

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

Выбор файлов на основе расширения файла

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

import os
 
all_files = os.listdir(os.getcwd())
txt_files = [file for file in all_files if file.endswith(".txt")]
print(f"Текстовые файлы в текущем каталоге: {txt_files}")

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

Исключение определенных файлов или каталогов

Вы также можете исключить определенные файлы или каталоги из списка. Например, чтобы исключить файлы или каталоги, начинающиеся с точки (скрытые элементы):

import os
 
all_items = os.listdir(os.getcwd())
visible_items = [item for item in all_items if not item.startswith(".")]
print(f"Видимые файлы и каталоги: {visible_items}")

Использование регулярных выражений для продвинутой фильтрации

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

import os
import re
 
all_files = os.listdir(os.getcwd())
pattern = r"^отчет_\d{4}.txt$"
matching_files = [file for file in all_files if re.match(pattern, file)]
print(f"Файлы, соответствующие шаблону: {matching_files}")

Это создаст список matching_files, содержащий только файлы, имена которых соответствуют регулярному выражению "^отчет_\d{4}.txt$", которое ищет файлы, начинающиеся с "отчет_", за которым следуют четыре цифры, и заканчивающиеся на ".txt".

Отображение информации о файле

Получение размера файла, даты создания/изменения

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

import os
from datetime import datetime
 
file_path = os.path.join(os.getcwd(), "пример.txt")
file_size = os.path.getsize(file_path)
modification_time = os.path.getmtime(file_path)
print(f"Размер файла: {file_size} байт")
print(f"Последнее изменение: {datetime.fromtimestamp(modification_time)}")

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

Печать подробной информации о файле в отформатированном виде

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

import os
from datetime import datetime
 
def print_file_info(file_path):
    """
    Печатает подробную информацию о файле, включая его имя, размер и время модификации.
    """
    file_name = os.path.basename(file_path)
    file_size = os.path.getsize(file_path)
    modification_time = os.path.getmtime(file_path)
    print(f"Имя файла: {file_name}")
    print(f"Размер файла: {file_size} байт")
    print(f"Последнее изменение: {datetime.fromtimestamp(modification_time)}")
 
# Пример использования
print_file_info(os.path.join(os.getcwd(), "пример.txt"))

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

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

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

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

import os
 
try:
    restricted_file = os.path.join(os.getcwd(), "ограниченный.txt")
    file_size = os.path.getsize(restricted_file)
    print(f"Размер файла: {file_size} байт")
except PermissionError:
    print(f"Ошибка: У вас нет разрешения на доступ к {restricted_file}")

Этот код попытается получить размер файла "ограниченный.txt", и если возникнет PermissionError, он выведет сообщение об ошибке.

Перехват и обработка исключений OSError

Модуль os может генерировать исключения OSError для различных проблем, связанных с файлами и каталогами. Вы можете перехватывать и обрабатывать эти исключения:

import os
 
try:
    nonexistent_file = os.path.join(os.getcwd(), "несуществующий.txt")
    file_size = os.path.getsize(nonexistent_file)
    print(f"Размер файла: {file_size} байт")
except OSError as e:
    print(f"Ошибка: {e}")

Этот код попытается получить размер файла "несуществующий.txt", и если возникнет OSError (например, файл не существует), он выведет сообщение об ошибке.

Практическое применение

Сценарии резервного копирования и архивирования

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

import os
import zipfile
 
def backup_directory(directory, zip_filename):
    """
    Создает ZIP-архив всех файлов в каталоге и его подкаталогах.
    """
    with zipfile.ZipFile(zip_filename, "w") as zip_file:
        for root, _, files in os.walk(directory):
            for file in files:
                file_path = os.path.join(root, file)
                zip_file.write(file_path)
 
# Пример использования
backup_directory(os.getcwd(), "резервная_копия.zip")
print("Резервное копирование каталога завершено.")

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

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

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

import os
import shutil
 
def organize_files(directory):
    """
    Организует файлы в каталоге, перемещая их в подкаталоги на основе их расширений.
    """
    for file_name in os.listdir(directory):
        if os.path.isfile(file_name):
            file_extension = os.path.splitext(file_name)[1]
            destination_directory = os.path.join(directory, file_extension[1:])
            os.makedirs(destination_directory, exist_ok=True)
            shutil.move(file_name, destination_directory)
 
# Пример использования
organize_files(os.getcwd())
print("Организация файлов завершена.")

Функция organize_files() принимает путь к каталогу и перемещает файлы в подкаталоги на основе их расширений.

Функции

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

def calculate_area(length, width):
    area = length * width
    return area
 
# Использование
rectangle_length = 5
rectangle_width = 3
result = calculate_area(rectangle_length, rectangle_width)
print(f"Площадь прямоугольника составляет {result} квадратных единиц.")

В этом примере функция calculate_area() принимает два параметра: length и width, и вычисляет площадь, умножая их друг на друга. Затем функция возвращает вычисленную площадь.

Вы также можете определить функции, которые не принимают никаких параметров и не возвращают значения:

def greet_user():
    print("Привет, пользователь!")
 
# Использование
greet_user()

Функции также могут иметь значения по умолчанию для параметров, что делает их более гибкими:

def calculate_circle_area(radius, pi=3.14159):
    area = pi * radius ** 2
    return area
 
# Использование
circle_radius = 4
result = calculate_circle_area(circle_radius)
print(f"Площадь круга составляет {result} квадратных единиц.")
 
# Использование с пользовательским значением pi
result = calculate_circle_area(circle_radius, pi=3.14)
print(f"Площадь круга составляет {result} квадратных единиц.")

В этом примере функция calculate_circle_area() имеет значение по умолчанию для параметра pi, равное 3.14159, но вы также можете передать свое значение при необходимости.

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

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

Вот пример использования встроенного модуля math:

import math
 
# Использование
radius = 5
circle_area = math.pi * radius ** 2
print(f"Площадь круга составляет {circle_area:.2f} квадратных единиц.")

В этом примере мы импортируем модуль math и используем его константу pi для вычисления площади круга.

Вы также можете импортировать конкретные функции или переменные из модуля:

from math import pi, sqrt
 
# Использование
radius = 5
circle_area = pi * radius ** 2
square_root = sqrt(25)
print(f"Площадь круга составляет {circle_area:.2f} квадратных единиц.")
print(f"Квадратный корень из 25 равен {square_root}.")

Такой подход позволяет вам обращаться к функциям pi и sqrt() непосредственно, без необходимости указывать имя модуля math..

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

Вот пример создания простого пакета:

my_package/
    __init__.py
    math_utils.py
    string_utils.py

В этом примере my_package является пакетом, а math_utils.py и string_utils.py - модулями внутри пакета. Файл __init__.py необходим для пометки каталога как пакета.

Затем вы можете импортировать и использовать функции из модулей внутри пакета:

from my_package.math_utils import calculate_area
from my_package.string_utils import reverse_string
 
# Использование
rectangle_area = calculate_area(5, 3)
print(f"Площадь прямоугольника составляет {rectangle_area} квадратных единиц.")
 
reversed_text = reverse_string("Python")
print(f"Перевернутая строка: {reversed_text}")

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

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

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

Вот пример обработки исключения ZeroDivisionError:

def divide_numbers(a, b):
    try:
        result = a / b
        return result
    except ZeroDivisionError:
        print("Ошибка: деление на ноль.")
        return None
 
# Использование
dividend = 10
divisor = 0
result = divide_numbers(dividend, divisor)
if result is not None:
    print(f"Результат {dividend} / {divisor} равен {result}.")
else:
    print("Невозможно выполнить деление.")

В этом примере функция divide_numbers() пытается разделить параметр a на параметр b. Если b равно нулю, возникает исключение ZeroDivisionError, и функция обрабатывает его, печатая сообщение об ошибке и возвращая None.

Вы также можете обрабатывать несколько исключений в одном блоке try-except:

def process_input(user_input):
    try:
        value = int(user_input)
        return value
    except ValueError:
        print("Ошибка: неверный ввод. Пожалуйста, введите число.")
        return None
    except Exception as e:
        print(f"Произошла непредвиденная ошибка: {e}")
        return None
 
# Использование
user_input = input("Введите число: ")
result = process_input(user_input)
if result is not None:
    print(f"Введенное значение: {result}")

В этом примере функция process_input() пытается преобразовать user_input в целое число с помощью функции int(). Если ввод не является допустимым числом, возникает исключение ValueError, которое обрабатывается печатью сообщения об ошибке и возвращением None. Кроме того, функция также обрабатывает любые другие неожиданные исключения печатью общего сообщения об ошибке и возвращением None.

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

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

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

Вот пример чтения из файла:

# Чтение из файла
with open("example.txt", "r") as file:
    content = file.read()
    print(f"Содержимое файла:\n{content}")

В этом примере функция open() используется для открытия файла "example.txt" в режиме чтения ("r"). Конструкция with гарантирует правильное закрытие файла после выполнения блока кода, даже если происходит исключение.

Вы также можете читать файл построчно:

# Чтение файла построчно
with open("example.txt", "r") as file:
    for line in file:
        print(line.strip())

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

Для записи в файл можно использовать режим записи ("w") или режим добавления ("a"):

# Запись в файл
with open("output.txt", "w") as file:
    file.write("Это первая строка.\n")
    file.write("Это вторая строка.\n")
 
# Добавление в файл
with open("output.txt", "a") as file:
    file.write("Это новая строка, добавленная в файл.\n")

В первом примере файл "output.txt" открывается в режиме записи, и в него записываются две строки текста. Во втором примере тот же файл открывается в режиме добавления, и новая строка добавляется в конец файла.

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

Выводы

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

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

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

MoeNagy Dev