Текущая директория в Python
Как в Python — программе узнать путь до текущей директории со скриптом. Я знаю, что для этого требуется библиотека os, но там столько различных классов и функций, что можно пол дня убить на поиски.
5 ответов 5
Если вы запускаете скрипт C:\Scripts\script.py из D:\work папки:
D:\work> py C:\Scripts\script.py
- D:\work — это текущая рабочая директория на момент старта скрипта. open(‘file.txt’) будет пытаться открыть D:\work\file.txt файл
- C:\Scripts — это директория со скриптом.
Текущая рабочая директория
Текущая рабочая директория возвращается os.getcwd() функцией, где CWD это Current Working Directory («текущая рабочая директория»). os.getcwdb() возвращает путь в виде байт. Происхождение функции от POSIX getcwd(3) . Другие способы могут вернуть разные результаты в зависимости от настроек доступа промежуточных директорий, общей длины (от платформы зависит) итд—не изобретайте своих способов, если не осознаёте всех последствий возможного изменения в поведении функции. Также нетрадиционные способы получения рабочей директории могут ухудшить читаемость другими Питон-программистами. Из The Zen of Python :
There should be one— and preferably only one —obvious way to do it.
По умолчанию относительные пути используют именно эту директорию, поэтому явно вызывать os.getcwd() редко нужно. Например, open(‘file.txt’) вызов открывает файл ‘file.txt’ в текущей директории. Если необходимо передать полный путь в виде строки, то можно использовать os.path.abspath(‘file.txt’) — getcwd() снова явно не используется.
Path.cwd() из pathlib модуля возвращает путь к текущей директории как объект c разными полезными и удобными методами такими как .glob(‘**/*.py’) .
Директория со скриптом
Текущая рабочая директория может отличаться от директории с текущим Питон-скриптом. Часто, но не всегда можно os.path.dirname(os.path.abspath(__file__)) использовать, чтобы получить директорию с текущим Питон скриптом, но это не всегда работает. Посмотрите на get_script_dir() функцию, которая поддерживает более общий случай.
Если хочется получить данные из файла, расположенного относительно установленного Питон-модуля, то используйте pkgutil.get_data() или setuptools’ pkg_resources.resource_string() вместо построения путей c помощью __file__ . Это работает даже, если ваш пакет упакован в архив. В Python 3.7 появился importlib.resources модуль. К примеру, если у вас есть Питон пакет data внутри которого лежит файл.txt , то чтобы достать текст:
import importlib.resources text = importlib.resources.read_text('data', 'файл.txt')
Если вы хотите найти место куда пользовательские данные можно положить, то appdirs модуль предоставляет переносимый способ:
import appdirs # $ pip install appdirs user_data_dir = appdirs.user_data_dir("Название приложения", "Кто создал")
Разные платформы (Windows, MacOS, Linux) используют разные соглашения, appdirs позволяет не плодить сущностей и использовать на каждой платформе подходящие директории.
Как задать путь к файлу в Python?
Для решения задач, связанных с редактированием или чтением файла, необходимо сообщить интерпретатору Python имя нужного нам файла, а также адрес, по которому этот файл располагается. Существуют разные способы указания пути к файлу в Python: от самого простого, до самого правильного. Давайте выясним, чем эти варианты отличаются и почему простой вариант не годится на роль лучшего!
Самый простой вариант — не самый верный!
Внимание! У этого способа обнаружен недостаток!
Самый простой вариант задания пути выглядит как последовательность директорий, в которых находится файл, с именем самого файла, разделенные знаками слеша:
Пример относительного пути:
path = "Files/info.txt" # в Линуксе, или: path = "Files\info.txt" # в Windows
Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Пример абсолютного пути:
path = "/home/my_comp/Files/info.txt" # для Линукс, или: path = "C:\Python\pythonw.exe\Files\info.txt" # для Windows
Где вместо «C:\Python\pythonw.exe\Files\info.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.
Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «\», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!
Указываем путь к файлу правильно!
Внимание! Годный вариант!
Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:
import pathlib from pathlib import Path
Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:
Задаем относительный путь с помощью Path!
После того, как класс импортирован, мы получаем власть над слешами! Теперь вопрос о прямых и обратных слешах в разных операционных системах ложится на плечи Path. Используя Path, вы можете корректно задать относительный путь, который будет работать в разных системах.
Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):
import pathlib from pathlib import Path path = Path("files", "info", "docs.txt") ## выведем значение переменной path: print(str(path))
## выведем значение переменной path: files/info/docs.txt
У нас появился Telegram-канал для изучающих Python! Канал совсем свежий, подпишись одним из первых, ведь вместе «питонить» веселее! 😉 Ссылка на канал: «Кодим на Python!»
Задаем абсолютный путь с помощью Path
- cwd() — возвращает путь к рабочей директории
- home() — возвращает путь к домашней директории
Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :
Пример 1: с использованием функции cwd():
import pathlib from pathlib import Path #Получаем строку, содержащую путь к рабочей директории: dir_path = pathlib.Path.cwd() # Объединяем полученную строку с недостающими частями пути path = Path(dir_path, 'files','info', 'docs.txt') # выведем значение переменной path: print(str(path))
# выведем значение переменной path: "/home/my_comp/python/files/info/docs.txt"
В данном случае путь к директории имеет вид: dir_path = «/home/my_comp/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/my_comp/python/files/info/docs.txt».
Представленный выше код можно оптимизировать и записать в одну строку:
import pathlib from pathlib import Path path = Path(pathlib.Path.cwd(), 'files', 'info', 'docs.txt') # значение переменной path: print(str(path))
# значение переменной path: "/home/my_comp/python/files/info/docs.txt"
Пример2: с использованием функции home():
import pathlib from pathlib import Path #Получаем строку, содержащую путь к домашней директории: dir_path = pathlib.Path.home() # Объединяем полученную строку с недостающими частями пути path = Path(dir_path, 'files','info', 'docs.txt') # Выведем значение переменной path: print(str(path))
# Выведем значение переменной path: "/home/my_comp/files/info/docs.txt"
В данном случае путь к директории имеет вид: dir_path = «/home/my_comp», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/my_comp/files/info/docs.txt».
Сократим представленный выше код:
import pathlib from pathlib import Path path = Path(pathlib.Path.home(), 'files', 'info', 'docs.txt') # Значение переменной path: print(str(path))
# Значение переменной path: "/home/my_comp/files/info/docs.txt"
Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().