popov . dev

Главная

Библиотека

Статьи

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

Работа с модулем os в Python

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

Давайте рассмотрим несколько примеров. Вы можете запустить эти примеры кода непосредственно в Visual Studio Code. Если хотите, вы также можете использовать IPython, который является удобным инструментом командной строки для Python.

Пример: Некоторые методы работы с операционной системой Python.

import os

# отображает список каталогов текущей директории
os.listdir(".") 

# переименовать директорию или файл
os.rename("old_file", "new_file") 

# сменить права доступа директории или файла
os.chmod("filename | directory", 0o777) 

# создать новый каталог
os.mkdir("directory name") 

# рекурсивное создание каталогов
os. makedirs("my_folder/my_subfolder") 

# удалить файл
os.remove("filename") 

# удаление каталога
os.rmdir("directory_path | directory name") 

# удаление дерева каталогов
os.removedirs("<directory_path>") 

# получить свойства файла или каталога
os.stat("<filname | directory>")

Работа с файлами и папками с помощью модуля “os.path”

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

Одна из наиболее часто используемых функций os.path - это возможность разделять и объединять пути. Для этого обычно используются три метода: split, basename и dirname.

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

import os

# узнать текущий каталог
current_directory = os.getcwd()

Используйте split для отделения конечного уровня от родительского пути.

os.path.split(current_directory)

Используя dirname, чтобы получить родительский путь.

os.path.dirname(current_directory)

Используйте базовое имя, чтобы получить конечное имя или имя файла.

os.path.basename(current_directory)

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

Переместимся в самый верх к корню, используя цикл while

import os

current_directory = os.getcwd()
 
while os.path.basename(current_directory):
    current_directory = os.path.dirname(current_directory)
    print(current_directory)

Что на самом деле делает этот код?

Во-первых, мы импортируем модуль os. Этот модуль предоставляет функции для взаимодействия с операционной системой, включая операции с файлами и каталогами. Во-вторых, current_directory = os.getcwd() получает текущий рабочий каталог с помощью os.getcwd(). Он присваивает путь к текущему каталогу переменной current_directory.

Цикл while продолжается до тех пор, пока os.path.basename(current_directory) не станет пустой строкой. Условие os.path.basename(current_directory) проверяет, есть ли у текущего каталога родительский каталог. Другими словами, он продолжается до тех пор, пока не достигнет корневого каталога, где os.path.basename(current_directory) будет пустой строкой.

Для каждой итерации цикла код использует os.path.dirname(current_directory) для перемещения на один уровень вверх в иерархии каталогов. Он присваивает путь к родительскому каталогу переменной current_directory. После перехода на следующий уровень код выводит путь к текущей директории на консоль.

С помощью цикла for вы можете сделать то же самое

import os

current_directory = os.getcwd()
directory = []

for _ in range(current_directory.count(os.sep)):
    current_directory = os.path.dirname(current_directory)
    directory.insert(0, current_directory)

for dirs in reversed(directory):
    print(dirs)

Здесь мы импортируем модуль os и получаем текущий рабочий каталог с помощью os.getcwd(), который хранится в переменной current_directory. Для хранения иерархии каталогов создается пустой список: directory = [...]. Цикл for выполняет итерации в зависимости от количества разделителей каталогов (os.sep) в current_directory. Цель состоит в том, чтобы просмотреть дерево каталогов, начиная с непосредственного родительского каталога текущего каталога и двигаясь вверх.

В системах на базе Unix (включая Linux и macOS) os.sep обозначается прямой косой чертой (/). В Windows os.sep обозначается обратной косой чертой (\).

current_directory.count(os.sep) вычисляет, сколько раз os.sep (разделитель каталогов для текущей операционной системы) появляется в пути к каталогу current_directory. Это число соответствует глубине каталога в иерархии.

current_directory = os.path.dirname(current_directory) используется для получения пути к родительскому каталогу на каждой итерации. directory.insert(0, current_directory) добавляет путь к родительскому каталогу в начале каталога. Поддержание порядка от родителя к потомку.

Второй цикл for выполняет итерацию по списку directory в обратном порядке после получения иерархии каталогов. for dirs in reversed(directory) выполняет цикл по каждому пути к каталогу в списке directory, начиная с корневого каталога и двигаясь вниз. print(dirs) выводит путь к каждому каталогу в терминал.

Использование модуля os для поиска файлов

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

Начнем с определения функции, называемой find_file(). Первым шагом этой функции является проверка текущего рабочего каталога.

import os 

def find_file(file_name="tree.py"):
    current_directory = os.getcwd()
    full_path = os.path.join(current_directory, file_name)

    print(f"Проверяем {full_path}")

    if os.path.exists(full_path):
        return full_path

В функции find_file() мы продолжим поиск по домашнему каталогу пользователя. Важно отметить, что мы используем функцию expanduser() для расширения пути, как упоминалось ранее.

    home_dir = os.path.expanduser("~/") # развернем путь до домашней папки
    full_path = os.path.join(home_dir, file_name)

    print(f"Проверяем {full_path}")

    if os.path.exists(full_path):
        return full_path

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

    file_path = os.path.abspath(__file__)
    parent_path = os.path.dirname(file_path)
    full_path = os.path.join(parent_path, file_name)

    print(f"Проверяем {full_path}")

    if os.path.exists(full_path):
        return full_path

Получаем результат:

    print(f"Файл {file_name} не найден")


file_name = find_file()
if file_name:
    print(f"Файл найден: {file_name}")

Весь код полностью

import os

def find_file(file_name="tree.py"):

    current_directory = os.getcwd()
    full_path = os.path.join(current_directory, file_name)
    print(f"Проверяем {full_path}")

    if os.path.exists(full_path):
        return full_path

    home_dir = os.path.expanduser("~/")
    full_path = os.path.join(home_dir, file_name)
    print(f"Проверяем {full_path}")

    if os.path.exists(full_path):
        return full_path

    file_path = os.path.abspath(__file__)
    parent_path = os.path.dirname(file_path)
    full_path = os.path.join(parent_path, file_name)
    print(f"Проверяем {full_path}")

    if os.path.exists(full_path):
        return full_path

    print(f"Файл {file_name} не найден")


file_name = find_file()
if file_name:
    print(f"Файл найден: {file_name}")

Этот код определяет функцию Python под названием find_file, которая отвечает за поиск файла с именем "tree.py" в разных местах. Функция принимает необязательный параметр file_name, значение которого по умолчанию равно "tree.py." Сначала она получает текущий рабочий каталог с помощью функции os.getcwd() и объединяет его с file_name для создания полного пути. Будет выведено сообщение, что данный путь проверяется.

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

Наконец, если file_name не является пустым, выводится сообщение, указывающее местоположение файла.

Однако этот код повторяется. Если вы присмотритесь, то заметите, что мы использовали full_path несколько раз. И мы неоднократно проверяем os.path.exists(). Мы можем усовершенствовать и оптимизировать этот код, чтобы сделать его более простым и читабельным

import os

def find_file(file_name="tree.py"):
    list_dir = [
        os.getcwd(), 
        os.path.expanduser("~/"),  
        os.path.dirname(os.path.abspath(__file__))
    ]

    for path in list_dir:
        if path is not None:
            file_path = os.path.join(path, file_name)
            if os.path.exists(file_path):
                print(f"Проверяем {file_path}")
                return file_path

    print(f"Файл {file_name} не найден")

file_name = find_file()
if file_name:
    print(f"Найден файл: {file_name}")

Краткое объяснение того, что делает этот код

В этой функции мы выполняем задачу, аналогичную предыдущей, но мы ввели список внутри функции для упрощения итераций и настройки. Цикл for проходит по списку, чтобы создать путь к файлу. Если параметр file_path существует, он выводит полный путь к файлу; в противном случае это означает, что файл не был найден.

Взаимодействие с операционной системой через модуль os

Модуль os предоставляет ряд атрибутов и функций для работы с операционной системой. Ниже приведены некоторые примеры из практики. Вы можете выполнить пример кода либо в Visual Studio Code, либо через IPython

import os

# получить текущую директорию
os.getcwd()

# изменить текущий каталог
os.chdir("<dir_name>")

os.getcwd()

# os.environ хранит переменные среды окружения
# мы устанавливаем когда модуль os загружен
os.environ.get("CONFIG")

# это параметр и переменная среды 
# существует для наших подпроцессов
os.environ["CONFIG"] = "DEBUG"

os.environ.get("CONFIG")

# логин текущего пользователя
# терминал запустил этот процесс
os.getlogin()

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

Заключение

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

Комментарии

Для того чтобы оставить свое мнение, необходимо зарегистрироваться на сайте