Работа с модулем 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.
Комментарии
Для того чтобы оставить свое мнение, необходимо зарегистрироваться на сайте