8 практических способов использования модуля os в Python

8 практических способов использования модуля os в Python


Перейти по ссылкам

  • Работа с операциями каталогов
  • Навигация по файловой системе
  • Управление путями файлов
  • Управление разрешениями файлов
  • Работа с переменными среды
  • Выполнение системных команд
  • Получение информации о системе
  • Обход дерева каталогов

Беспокоитесь о создании программ на Python, независимых от операционной системы? Модуль os — это прямой канал Python к вашей операционной системе. Можно назвать его швейцарским ножом для повседневных задач, связанных с вашей системой. Давайте посмотрим, какие трюки скрывает модуль os.

Обработка операций с каталогами

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

import os # Create a folder for PDFs if it does not exist if not os.path.exists("pdfs"):    os.mkdir("pdfs") # Create a nested folder structure for images os.makedirs("images/2025/events", exist_ok=True) # List the contents of the current directory print("Current directory contents:", os.listdir(".")) # Remove an empty directory os.rmdir("old_folder")  # only works if "old_folder" has no files inside     

Фрагмент os.path.exists("pdfs") проверяет, существует ли папка, чтобы избежать ошибок при вызове os.mkdir(). os.makedirs(..., exist_ok=True) — удобный способ создать вложенные директории. Флаг exist_ok=True предотвращает ошибку, если папка уже существует. os.listdir(".") выводит все в текущей папке ("." означает текущую директорию). os.rmdir("old_folder") удаляет пустую директорию, но не удалит её, если внутри есть файлы. Всего несколькими строками кода вы уже можете автоматизировать распространённые задачи по организации файлов.

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

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

import os # Show the starting directory print("Starting directory:", os.getcwd()) # Navigate to the "logs" folder os.chdir("logs") print("Now inside:", os.getcwd()) # List files inside "logs" print("Log files:", os.listdir(".")) # Go back to the original directory os.chdir("..") print("Back to:", os.getcwd())

os.getcwd() показывает, где в данный момент выполняется ваш скрипт. os.chdir("logs") перемещает рабочую директорию в папку «logs/», поэтому любые операции с файлами будут выполняться там по умолчанию. os.listdir(".") снова показывает, что находится в текущей директории. На этот раз содержимое «logs/.». Наконец, os.chdir("..") возвращает нас в родительскую директорию.

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

Управление путями к файлам

Позвольте мне начать с истории. Я работал над программным проектом с моим другом. Я использовал Linux, а он — Windows. В то время я не знал, как использовать пути к файлам универсально. Поэтому мы оба жёстко прописывали пути к файлам для каждой из наших систем.

Предположим, вы хотите, чтобы ваш скрипт работал независимо от операционной системы: Windows, macOS или Linux. Проблема в чем? Пути к файлам выглядят по-разному в каждой системе (C:Users… в Windows против /home/… в Linux). Здесь на помощь приходят утилиты os.path. Они обрабатывают пути безопасным и кроссплатформенным образом, так что вам не нужно беспокоиться о слэшах или разделителях. Вот как это может выглядеть на практике:

import os # Build a path to a new report folder = "reports" filename = "summary.txt" path = os.path.join(folder, filename) print("Full path:", path) # Check if the folder exists if not os.path.exists(folder):    os.mkdir(folder) # Absolute path (so you know exactly where your file will go) print("Absolute path:", os.path.abspath(path)) # Split a path into directory and filename directory, file = os.path.split(path) print("Directory:", directory) print("File:", file) # Get just the filename directly print("Basename:", os.path.basename(path)) # Split a filename into name and extension name, ext = os.path.splitext(file) print("Name:", name) print("Extension:", ext)     

Так что здесь происходит?

  • os.path.join(folder, filename) гарантирует правильность пути для системы. В Windows используются обратные слэши (reportssummary.txt); в Linux и macOS — прямые слэши (reports/summary.txt).
  • Метод os.path.exists(folder) проверяет, существует ли папка или файл, прежде чем создавать их.
  • os.path.abspath(path) определяет абсолютный путь, что полезно, когда нужно быть уверенным, где будет находиться ваш файл.
  • os.path.split(path) делит путь на две части: папку и файл.
  • os.path.basename(path) — это сокращение для получения только имени файла из полного пути.
  • os.path.splitext(file) помогает отделить имя от расширения.

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

Управление разрешениями файлов

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

Вот пример в действии.

import os import stat file_path = "example.txt" # Check if the file is readable and writable if os.access(file_path, os.R_OK) and os.access(file_path, os.W_OK):    print(f"{file_path} is readable and writable") # Make the file read-only os.chmod(file_path, stat.S_IREAD) print(f"{file_path} is now read-only") # Make the file executable (useful for scripts or binaries) os.chmod(file_path, stat.S_IREAD | stat.S_IEXEC) print(f"{file_path} is now executable")     

os.access(file_path, os.R_OK) проверяет, доступен ли файл для чтения, а os.access(file_path, os.W_OK) проверяет, доступен ли он для записи. os.chmod(file_path, stat.S_IREAD) устанавливает файл только для чтения. Модуль stat предоставляет константы, такие как S_IREAD, S_IWRITE и S_IEXEC, чтобы сделать это понятнее. Вы можете комбинировать флаги с помощью | (побитовое ИЛИ), например stat.S_IREAD | stat.S_IEXEC, чтобы сделать файл и читаемым, и исполняемым.

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

Работа с переменными среды

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

import os # Get an environment variable api_key = os.getenv("API_KEY") if api_key:    print("API key found:", api_key[:4] + "****")  # Masking for safety else:    print("API key not found. Please set it.") # Set an environment variable (for current session only) os.environ["MODE"] = "development" print("Running in mode:", os.environ["MODE"])     

os.getenv("API_KEY") получает значение переменной окружения с именем API_KEY. Если такой переменной не существует, возвращается None (или значение по умолчанию, которое вы укажете). os.environ["MODE"]="development" устанавливает переменную окружения на время работы вашей программы. Она не сохраняется после завершения программы, но полезна для настройки во время выполнения. Использование переменных окружения помогает держать конфиденциальные данные вне исходного кода и позволяет легко переключаться между различными конфигурациями.

Выполнение системных команд

Иногда Python не может выполнить всё напрямую. В других случаях проще позволить операционной системе справиться с задачей. Например, вы можете захотеть проверить сегодняшнюю дату и текущее время, очистить экран или запустить утилиту, установленную на вашем компьютере. Модуль os предоставляет простой способ сделать это с помощью os.system(command). Вот пример:

import os # Show the current date (works differently depending on OS) os.system("date") # Clear the terminal screen # "cls" is for Windows, "clear" is for Linux/macOS os.system("cls" if os.name == "nt" else "clear")     

Теперь, для более практической задачи. Предположим, вы хотите очистить старые временные файлы в определённой папке. Хотя это можно сделать с помощью чистого Python, вызов системной команды, такой как rm (Linux/macOS) или del (Windows), может быть быстрым:

import os # Remove all .tmp files in the "temp" folder if os.name == "nt":  # Windows    os.system("del temp\*.tmp") else:  # Linux / macOS    os.system("rm temp/*.tmp")     

Использование os.system() в Python обычно не рекомендуется для большинства случаев, особенно при работе с пользовательским вводом или в производственной среде. Хотя оно может выполнять системные команды, оно имеет несколько ограничений по безопасности и функциональности по сравнению с модулем subprocess.

Получение информации о системе

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

import os print("Operating system:", os.name) print("Current process ID:", os.getpid()) print("Parent process ID:", os.getppid()) print("Logged in as:", os.getlogin()) print("Number of CPUs:", os.cpu_count()) # Extra details (Unix only) if hasattr(os, "uname"):    print("System info:", os.uname())     

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

Обход дерева каталогов

Предположим, вы хотите просмотреть папку с проектом и найти все файлы .log. Вместо того чтобы писать собственный рекурсивный код для проверки каждой подпапки, модуль Python os предоставляет вам os.walk(), который выполняет основную работу.

os.walk(path) генерирует последовательность кортежей (dirpath, dirnames, filenames) для каждой посещаемой папки. Для большинства задач, связанных с файлами, вы обычно сосредотачиваетесь на filenames.

import os search_dir = "project" target_ext = ".logs" for dirpath, dirnames, filenames in os.walk(search_dir):    for file in filenames:        if file.endswith(target_ext):            full_path = os.path.join(dirpath, file)            print("Found:", full_path)     

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


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

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *