Генерация путей в разных операционных системах
Давайте разберём работу с операционной системой и её файлами на примере решения задачи ниже.
Условия для задачи:
В задаче используются относительные и абсолютные пути к файлам. Для формирования условия задачи и понимания принципов её программирования нам необходимо вспомнить понятия относительного и абсолютного пути к файлам.
Относительный путь — путь к файлу относительно какой-нибудь отправной точки, например, текущей папки, программы, документа и так далее. Например: docs/project/my_file.txt — это относительный путь к файлу.
Относительный путь – это маршрут от текущего местоположения до нужного пункта назначения, как навигация от ближайшего ориентира. Подобно тому, как мы объясняем дорогу через знакомые места («от почты налево, потом мимо школы»), относительный путь указывает местонахождение файла от известной отправной точки.
Абсолютный путь — это точное расположение файла в системе файлов на диске. Это полный путь к файлу, который начинается с корня диска. Например: F:\Program Files\JetBrains\PyCharm2023.3\pythonProject\my_file.txt — это абсолютный путь.
Абсолютный путь – это полный адрес от начала координат файловой системы до конечного файла, как почтовый адрес с указанием страны, города, улицы и номера дома. Это самый точный способ указать расположение файла, начиная от корня системы, словно прокладывая маршрут от столицы до конкретной квартиры.
Текущая папка – это рабочий стол для хранения инструментов (программ) и материалов (документов), где программа как мастер-ключ открывает доступ к манипуляции документами-чертежами.
Документ – холст с информацией, который программа-художник меняет по воле пользователя, сохраняя результат обратно в текущую папку-галерею.
Файловая система – это организованное хранилище данных, подобное большой библиотеке с четкой системой каталогизации. Как в библиотеке каждая книга имеет свой шифр и место на полке, так и каждый файл в системе имеет свой уникальный путь и местоположение.
В нашей задаче нам нужно сформировать относительный путь к файлу, который мы будем использовать в других скриптах проектов. Допустим, что сам путь состоит из последовательности двух папок (возможно и больше), которые нам известны. А так же известно имя нашего файла. Одну из папок и имя файла вводит нам пользователь (в нашем примере мы их сразу введём в программу).
Нам необходимо написать код, который выведет относительный и абсолютный путь к этому файлу на консоль.
Правильная демонстрация кода программы:
Тот же код ниже для копирования и вставки в программу. Не забывайте про необходимый отступ пробелами в определённых местах в начале строки, так как код на сервере блога может отображаться некорректно.
import os
folder_name = 'project'
file_name = 'my_file.txt'
path = 'docs/{folder}/{file}'.format(
folder=folder_name,
file=file_name,
)
print(path)
rel_path = os.path.join('docs', folder_name, file_name)
print(rel_path)
abs_path = os.path.abspath(file_name)
print(abs_path)
Результат работы кода:
Базовая работа с путями (построковый разбор кода программы)
- import os # Модуль системы, который работает с операционной системой пользователя. os - переводится как операционная система (сокращенное os).
- folder_name = 'project' # Имя папки, которое ввёл пользователь. В нашем случае имя папки, введённое пользователем, мы сразу внесли в программу, сокращая программу.
- file_name = 'my_file.txt' # Имя файла, которое ввёл наш пользователь. В нашем случае мы сразу ввели его в структуру нашего кода.
- path = 'docs/{folder}/{file}'.format # Форматирование нашего пути. Выводит на консоль: docs/project/my_file.txt
- rel_path = os.path.join('docs', folder_name, file_name) # Переменная, куда заносится правильный относительный путь. os — непосредственное обращение к модулю os, которое позволяет нам взаимодействовать с системой пользователя. Подмодуль .path позволяет работать с путями в файловой системе. В подмодуле path мы вызываем функцию .join с помощью которой мы формируем путь к файлу.
# Безопасный способ с использованием os.path.join
rel_path = os.path.join('docs', folder_name, file_name)
- print(rel_path) # Получение правильного относительного пути в нашей системе: docs\project\my_file.txt. В этом примере создаётся правильный относительный путь, для моей операционной системы — это Windows 10. И этот результат сгенерировался правильно именно под мою систему.
- abs_path = os.path.abspath(file_name) # Здесь мы опять обращаемся к модулю os, а затем обращаемся к подмодулю .path. И в нём вызвали метод .abspath. Этот метод .abspath отвечает за генерацию относительного пути. В скобках указывается путь, папка, либо конкретный файл для которого нам необходимо произвести генерацию пути.
# Получение абсолютного пути
abs_path = os.path.abspath(file_name) # F:\Program Files\JetBrains\PyCharm2023.3\pythonProject\my_file.txt
- print(abs_path) # выдаст нам результат абсолютного пути F:\Program Files\JetBrains\PyCharm2023.3\pythonProject\my_file.txt от корня системы (F:\) и заканчивая папкой в которой был запущен этот скрипт.
Ключевые особенности кода:
- Модуль os обеспечивает кросс-платформенную совместимость;
- os.path.join() автоматически использует правильный разделитель путей;
- os.path.abspath() генерирует полный путь от корня файловой системы.
Немного теории:
В разных операционных системах относительные пути формируются по разному. При запуске со слешами (/) в разных системах, скорее всего, сформированный результат выдаст нам ошибку. И написанный код не сработает так как нам надо. Поэтому нам надо написать код, что бы наш путь сформировывался сам в зависимости от операционной системы компьютера пользователя, и был заточен под любую систему, не приводя к ошибкам.
import os — Для работы с операционной системой в Python используется специальный модуль os. С помощью этого модуля можно писать универсальные скрипты, которые будут работать в любой системе, соблюдая преемственность пути.
Для работы с путями и их генерацией из модуля os используется специальный подмодуль .path.
Что бы сформировать относительный путь до известных нам папок и имени файлов необходимо использовать os.path.join.
Для генерации абсолютного пути используется метод .abspath. По умолчанию .abspath идёт от корня системы до папки в которой запущен скрипт. При необходимости путь можно изменить под наши задачи.
Что бы из нужной директории получить список имен папок и файлов необходимо обратиться к модулю os и его методу .listdir.
Ниже мы разберём метод .listdir у модуля os.
Работа с директориями через os.listdir
Бывают случаи, когда нам необходимо написать код, который выведет на экран содержимое каждого проекта, то есть абсолютные пути для файлов и папок внутри проектов. В таком случае мы напишем следующий код ниже:
Тот же код ниже для копирования и вставки в программу. Не забывайте про необходимый отступ пробелами в определённых местах в начале строки, так как код на сервере блога может отображаться некорректно.
import os
def print_dirs(project):
print('\nСодержимое директории', project)
for i_elem in os.listdir(project):
path = os.path.join(project, i_elem)
print(' ', path)
project_list = ['Yaroslavl', 'My_project']
for i_project in project_list:
path_to_project = os.path.abspath(os.path.join('..', '..', i_project))
print_dirs(path_to_project)
Результат работы кода:
У Вас вывод результата будет свой. Если каталогов или файлов нет по заданному пути, то результат данного кода выдаст ошибку.
Разбор функционала:
- os.listdir() возвращает список всех файлов и директорий;
- os.path.join('..','..') перемещает на два уровня вверх по дереву директорий;
- Формирование абсолютных путей происходит автоматически с помощью цикла;
- def print_dirs(project): # Объявление функции;
- for i_elem in os.listdir(project): # Обращение к системе. Метод listdir возвращает нам список из названий папок и файлов, который находится по пути, указанного в скобках. Переменная i_elem в цикле позволяет нам перебирать элементы этого заданного списка;
- path = os.path.join(project, i_elem) # Сформировывает новый путь из переменной project;
- project_list = ['Yaroslavl', 'My_project'] # Список из двух проектов, находящихся у меня на жестком диске;
- for i_project in project_list: # Цикл, который пройдёт по нашим двум проектам;
- path_to_project = os.path.abspath(os.path.join('..', '..', i_project)) # Генерация абсолютного пути;
- print_dirs(path_to_project) # Вызов содержимого.
Рекомендации по улучшению кода:
- Обработка ошибок:
- Добавление фильтрации:
- Рекурсивный обход директорий:
Важные замечания:
- Кросс-платформенность: Всегда используйте os.path.join() вместо ручной конкатенации путей;
Конкатенация - это бинарная операция склеивания объектов линейной структуры (например, строк), где при слиянии слов «микро» и «мир» получается слово «микромир».
Конкатенация в Python — это операция объединения строковых значений в одно, что можно выполнить с помощью оператора + или метода join().
- Безопасность: Проверяйте существование путей через os.path.exists();
- Производительность: Для больших директорий рассмотрите использование os.scandir().
Заключение
Модуль os предоставляет мощный инструментарий для работы с файловой системой в Python. Правильное использование его методов позволяет создавать надёжный и переносимый код для работы с файлами и директориями.
Основные рекомендации:
- Всегда используйте os.path.join() для построения путей;
- Добавляйте обработку ошибок;
- Учитывайте особенности разных операционных систем;
- Тестируйте код на разных платформах.
ПОЛЕЗНЫЕ РЕСУРСЫ:
---------------------------------------------------
Сообщество дизайнеров в VK
https://vk.com/grafantonkozlov
Телеграмм канал сообщества
https://t.me/grafantonkozlov
Архив эксклюзивного контента
https://boosty.to/antonkzv
Канал на Дзен
https://dzen.ru/grafantonkozlov
---------------------------------------------------
Бесплатный Хостинг и доменное имя
https://tilda.cc/?r=4159746
Мощная и надежная нейронная сеть Gerwin AI
https://t.me/GerwinPromoBot?start=referrer_3CKSERJX
GPTs — плагины и ассистенты для ChatGPT на русском языке
https://gptunnel.ru/?ref=Anton
---------------------------------------------------