Как узнать путь к файлу Python?

Для работы с папками и получения списка файлов в Python используется модуль OS. На примерах рассмотрим ка получать файлы из разных директорий, расширения файлов и создавать новые.

Как узнать путь к файлу Python?

Модуль Python os — примеры создания и работы с папками и путями

21 февраля 2020

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

Модуль OS не нуждается в дополнительной установке, так как поставляется вместе с инсталлятором Python.

Навигация по посту

  • Получение директорий и списка файлов
    • Получение файлов через listdir
    • Получение полного абсолютного пути к файлам
    • Исключение каталогов или файлов из списка
    • Получение расширения файлов
  • Создание и удаление директорий
    • Проверка директорий и файлов на существование
  • Получение и изменение текущей директории

Получение директорий и списка файлов

Есть несколько способов вернуть список каталогов и файлов по указанному пути. Первый способ используя os.walk, который возвращает генератор:

Такие объекты можно итерировать для понятного отображения структуры:

Сам кортеж делится на 3 объекта: текущая директория, имя вложенных папок (если есть), список файлов. Я так же разделил их на примере ниже:

Os.walk является рекурсивным методом. Это значит, что для поиска файлов в конкретной директории вы будете итерировать и все вложенные папки. Обойти это с помощью самого метода нельзя, но вы можете использовать break так как os.walk возвращает указанную директорию первой. Можно так же использовать next():

Получение файлов через listdir

Есть еще один метод получения файлов используя listdir. Отличия от предыдущего метода в том, что у нас не будет разделения файлов и папок. Он так же не является рекурсивным:

Получение полного абсолютного пути к файлам

Для последующего чтения файла нам может понадобится абсолютный путь. Мы можем использовать обычный метод сложения строк или метод os.path.join, который сделает то же самое, но и снизит вероятность ошибки если программа работает на разных ОС:

Исключение каталогов или файлов из списка

У нас может быть список полных путей, например из списка выше, из которого мы хотим исключить папки или файлы. Для этого используется os.path.isfile:

Такой же принцип имеют следующие методы:

  • os.path.isdir() — относится ли путь к папке;
  • os.path.islink() — относится ли путь к ссылке;

Получение расширения файлов

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

os.path.basename(path) — вернет имя файла и расширение.

Создание и удаление директорий

Методы по изменению папок следующие:

  • os.mkdir() — создаст папку;
  • os.rename() — переименует;
  • os.rmdir() — удалит.

Если попытаться создать несколько вложенных папок сразу, используя предыдущий пример, появится ошибка FileNotFoundError. Создание папок включая промежуточные выполняется с os.makedirs():

Проверка директорий и файлов на существование

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

Получение и изменение текущей директории

Запуская любую программу или консоль, например CMD, мы это делаем из определенной директории. С этой и соседней директорией мы можем работать без указания полного пути. Для того что бы узнать такую директорию в Python используется метод os.getcwd():

В директории ‘D:’ сохранен мой файл, с которого я запускаю методы. Вы можете изменить такую директорию с os.chdir() . Такой подход удобен, когда файлы, с которыми вы работаете в основном находятся в другом месте и вы сможете избежать написания полного пути:

Так же как и в любых языках, в любых методах описанных выше, вы можете использовать ‘..’ для работы с директорией выше или ‘/’ для работы со внутренней:

Как получить путь к текущему исполняемому файлу в Python?

это может показаться вопрос новичка, но это не так. Некоторые общие подходы не работают во всех случаях:

sys.argv[0]

это означает использование path = os.path.abspath(os.path.dirname(sys.argv[0])) , но это не работает, если вы работаете из другого скрипта Python в другой каталог, и это может произойти в реальной жизни.

__файл__

это означает использование path = os.path.abspath(os.path.dirname(__file__)) , но я обнаружил, что это не работает:

  • py2exe нет __file__ атрибут, но есть решение
  • когда вы бежите от холостого хода с execute() нет __file__ атрибут
  • OS X 10.6, где я получаю NameError: global name ‘__file__’ is not defined

вопросы, связанные с неполными ответами:

  • Python-найти путь к запускаемому файлу
  • путь к текущему файлу зависит от того, как я выполнить программа
  • как узнать путь к запущенному скрипту в Python?
  • изменить каталог в каталог скрипта Python

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

обновление

вот результат теста:

вывод python a.py (on Windows)

subdir/b.py

дерево

10 ответов

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

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

Если у вас есть несколько основных сценариев в разных каталогах, вам может понадобиться более одной копии module_locator.

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

во-первых, вам нужно импортировать из inspect и os

далее, везде, где вы хотите найти исходный файл, вы просто используете

я столкнулся с подобной проблемой, и я думаю, что это может решить проблему:

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

Мое типичное использование:

теперь я использую _ _ modpath _ _ вместо _ _ file__.

короткий ответ:нет гарантированного способа получить нужную вам информацию, однако есть эвристика, которая работает почти всегда на практике. Вы можете посмотреть на как найти местоположение исполняемого файла в C?. Он обсуждает проблему с точки зрения C, но предлагаемые решения легко транскрибируются в Python.

это решение является надежным даже в исполняемых файлах

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

во-первых, вам нужно импортировать части проверить и os модули.

далее использовать следующая строка в любом другом месте нужна в вашем коде Python:

как работает:

из встроенного модуля os (описание ниже) импортируется.

OS подпрограммы для Mac, NT, или Posix в зависимости от того, какая система мы находимся на.

затем getsourcefile (описание ниже) импортируется из встроенного модуля inspect .

получить полезную информацию из live Python объекты.

  • abspath(path) возвращает абсолютную / полную версию пути к файлу
  • getsourcefile(lambda:0) каким-то образом получает внутренний исходный файл объекта лямбда-функции, поэтому возвращает ‘

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

используя abspath в результате getsourcefile(lambda:0) должен убедиться,что созданный путь к файлу является полным путем к файлу Python.
Это объясняло решение изначально было основано на коде из ответа на как получить путь к текущему исполняемому файлу в Python?.

Читайте также  Как открыть файл на андроид?

это должно сделать трюк кросс-платформенным способом (пока вы не используете интерпретатор или что-то еще):

sys.path[0] — это каталог, в котором находится ваш вызывающий скрипт (в первую очередь он ищет модули, которые будут использоваться этим скриптом). Мы можем снять название самого файла с конца sys.argv[0] (что я и сделала с os.path.basename ). os.path.join просто склеивает их вместе кросс-платформенным способом. os.path.realpath просто убедитесь, что мы получаем какие-либо символические ссылки с разными имена, чем сам скрипт, что мы по-прежнему получаем настоящее имя скрипта.

у меня нет Mac; поэтому я не тестировал это на одном. Пожалуйста, дайте мне знать, если это сработает, как кажется, это должно быть. Я тестировал это в Linux (Xubuntu) с Python 3.4. Обратите внимание, что многие решения этой проблемы не работают на Маках (так как я слышал, что __file__ нет на Macs).

обратите внимание, что если ваш скрипт является символической ссылкой, он даст вам путь к файлу, на который он ссылается (а не путь символической ссылки).

Pathlib — манипуляция путями, создание и удаление папок и файлов

Модуль Pathlib в Python упрощает работу с файлами и папками. Он доступен в Python 3.4 и более поздних версиях. Pathlib сочетает в себе лучшее из модулей файловой системы Python — os, os.path, glob и так далее.

Содержание статьи

  • Концепт пути и директории в Python
  • Как использовать модуль Pathlib?
  • Зачем использовать модуль Pathlib?
  • Создание и удаление папок через Pathlib
  • Генерация кроссплатформенных путей в Pathlib
  • Получение информации о пути в Pathlib
  • Альтернатива для модуля glob
  • Чтение и запись файлов с использованием Pathlib

В Python большинство скриптов предполагает работу с файловыми системами. Следовательно, неизбежно взаимодействие с названиями файлов и путями. Именно для этого в Python есть модуль Pathlib, который содержит полезные функции для выполнения задач, связанных с файлами. Pathlib предоставляет удобный для чтения и простой способ создания путей, представляя пути файловой системы в виде надлежащих объектов. Модуль позволяет создавать код, который можно переносить между платформами.

В данной статье мы подробно изучим модуль Pathlib с помощью различных примеров.

Концепт пути и директории в Python

Перед началом подробного рассмотрения модуля Pathlib важно разобраться в разнице между главными концептами темы — путем (path) и директорией (directory).

  • Путь используется для идентификации файла. Путь предоставляет необязательную последовательность названий директорий, в конце которой значится конечное имя файла, а также его расширение;
  • Расширение названия файла предоставляет некоторую информацию о формате/содержимом файла. Модуль Pathlib может работать как с абсолютными, так и с относительными путями;
  • Абсолютный путь начинается с корневой директории и определяет полное дерево каталогов;
  • Относительный путь, как следует из названия, является путем к файлу относительно другого файла или директории, обычно текущей;
  • Директория представляет собой запись пути в файловой системе и включает название файла, время создания, размер, владельца и так далее.

Модуль Pathlib в Python занимается задачами, связанными с путями, такими как создание новых путей из названий файлов и других путей, проверка различных свойств путей, создание файлов и папок по определенным путям.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Как использовать модуль Pathlib?

Для работы с Pathlib в Python требуется импортировать все классы данного модуля, используя следующую команду:

В качестве первого задания давайте извлечем текущую рабочую директорию и домашнюю директорию объектов, используя следующий код:

Вместо импорта всех классов можно использовать import pathlib . В таком случае, задействуя классы внутри модуля, требуется добавлять через pathlib .

Зачем использовать модуль Pathlib?

Если вы некоторое время работали с языком Python, у вас может возникнуть вопрос. Зачем нужен модуль Pathlib, когда уже есть модули os , os.path , glob и прочие? Это хороший вопрос. Давайте попробуем ответить на него, разобрав следующий пример.

Допустим, мы хотим создать файл под названием «output/output.xlsx» в текущем рабочем каталоге. Следующий код пытается сделать это с помощью модуля os.path . Также используются функции os.getcwd и os.path.join .

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

Данный код можно переписать, используя модуль Pathlib:

Такой формат проще укладывается в голове. В Pathlib функция Path.cwd() используется для получения текущего рабочего каталога, а оператор / используется вместо os.path.join для объединения частей пути в составной объект пути.

Шаблон вложенности функций в модуле os.path заменяется классом Path модуля Pathlib, что представляет путь через объединение методов и атрибутов. Умная перегрузка оператора / делает код читабельным и простым в обращении.

Другое преимущество метода, предоставляемого модулем Pathlib, заключается в том, что объект Path создается вместо строкового представления пути. У этого объекта есть несколько удобных методов, что имеют значительное преимущество перед работой с необработанными строками, которые представляют пути.

Создание и удаление папок через Pathlib

Классический модуль os.path используется только для манипуляции строками пути. Чтобы что-то сделать с путем, например, создать директорию, нам нужен модуль os . Модуль os предоставляет набор функций для работы с файлами и каталогами, например: mkdir для создания директории, rename для переименования, а getsize для получения ее размера.

Давайте напишем некоторые из этих операций с помощью модуля os , а затем перепишем тот же код с помощью модуля Pathlib.

Пример кода, написанный с использованием модуля os :

Если мы используем объекты path модуля Pathlib для достижения той же функциональности, конечный код будет читабельнее и легче для понимания:

В модуле os сложновато найти утилиты, связанные с путем. Модуль Pathlib решает эту проблему, заменяя утилиты модуля os методами объектов путя. Давайте попробуем разобраться в этом на примере следующего кода:

Здесь функция generate_data() принимает путь к файлу в качестве параметра и записывает данные в другой путь. Однако, если файл, который передается в качестве параметра, не изменяется, так как в последний раз была выполнена функция generate_data() , генерируется пустой файл. В этом случае пустой файл заменяется предыдущей версией файла.

Переменная outpath сохраняет данные, соединяя текущий рабочий каталог с названием файла «output». Мы также создаем временную версию, названную outpath.tmp . Если размер временной версии не равен нулю, что означает, что это не пустой файл, тогда временная версия переименовывается в outpath , в противном случае временная версия удаляется, а старая версия сохраняется.

Используя модуль os , манипулирование путями файловых систем в виде строковых объектов становится несколько корявым, поскольку используется несколько вызовов os.path.join() , os.getcwd() и так далее. Во избежание данной проблемы модуль Pathlib предлагает набор классов, что могут использоваться для популярных операций с путами через более читабельный, простой, объектно-ориентированный способ.

Попробуем переписать вышеуказанный код с модулем Pathlib:

При использовании Pathlib os.getcwd() становится Path.cwd() , а оператор ‘/’ нужен для объединения путей на месте os.path.join . Вместе с модулем Pathlib можно значительно упростить код, задействуя операторы и вызовы метода.

Популярные методы и их предназначение:

  • Path.cwd() : Возвращает путь объекта текущей рабочей директории;
  • Path.home() : Возвращает путь объекта домашней директории;
  • Path.stat() : Возвращает информацию о пути;
  • Path.chmod() : Меняет режим и уровень доступа файла;
  • Path.glob(pattern) : Получение всех файлов которые соответствую паттерну, например *.jpg (все картинки) или *.mp3 (все песни);
  • Path.mkdir() : создает новую папку по данному пути;
  • Path.open() : Открывает файл, созданный в пути;
  • Path.rename() : Переименовывает файл или директорию указанной цели;
  • Path.rmdir() : Удаляет пустую директорию;
  • Path.unlink() : Удаляет файл или символическую ссылку.

Генерация кроссплатформенных путей в Pathlib

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

Читайте также  Как восстановить поврежденные файлы?

Если вы хотите, чтобы ваш код работал, независимо от базовой ОС, вам нужно будет обрабатывать различные соглашения, характерные для базовой платформы. Модуль Pathlib упрощает работу с путями к файлам. В Pathlib можно просто передать путь или название файла объекту Path() , используя слеш, независимо от ОС. Pathlib занимается всем остальным.

Объект Path() конвертирует / в слеш соответствующий операционной системе. pathlib.Path может представлять путь Windows или Posix. Кроме того, Pathlib решает многие кросс-функциональные баги, легко обрабатывая пути.

Получение информации о пути в Pathlib

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

Как задать путь к файлу в Python?

Как задать путь к файлу в Python?

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

Самый простой вариант — не самый верный!

Внимание! У этого способа обнаружен недостаток!

Самый простой вариант задания пути выглядит как последовательность директорий, в которых находится файл, с именем самого файла, разделенные знаками слеша:

Пример относительного пути:

Где вместо «Files» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Пример абсолютного пути:

Где вместо «C:Pythonpythonw.exeFilesinfo.txt», «home/my_comp/Files/» и «info.txt» Вы напишите названия ваших директорий и имя вашего файла соответственно.

Этот вариант рабочий, однако, один существенный недостаток лишил его внимания разработчиков. Проблема заключается в том, что заданные таким способом пути адаптированы только к одному виду операционной системы: к Линукс, либо к Windows, так как в Windows используются обратные слеши «», а в Линукс — обычные «/». Из-за этого скрипт, показывавший отличные результаты в Windows, начнет жаловаться на отсутствие файлов по прописанному пути в Linux, и наоборот. А с абсолютным путем вообще все сложно: никакого диска «C:» в Линуксе нет. Скрипт опять будет ругаться! Что же делать? Правильно указать путь к файлу!

Указываем путь к файлу правильно!

Внимание! Годный вариант!

Python — умный змей, поэтому в его арсенале, начиная с 3.4 версии появился модуль pathlib, который позволяет вытворять самые приятные вещи с путями к файлу, стоит только импортировать его класс Path:

Кстати, если у вас не установлен модуль pathlib, это легко исправить с помощью команды:

Задаем относительный путь с помощью Path!

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

Например, в случае расположения файлов, как на представленном изображении, относительный путь, определяемый в скрипте «main_script.py», сформируется автоматически из перечисленных в скобках составных частей. Pathlib инициализирует новый объект класса Path, содержимым которого станет сформированный для Вашей системы относительный путь (в Windows части пути будут разделены обратными слешами, в Linux — обычными):

Задаем абсолютный путь с помощью Path

  • cwd() — возвращает путь к рабочей директории
  • home() — возвращает путь к домашней директории

Полученную строку, содержащую путь к рабочей или домашней директории, объединим с недостающими участками пути при инициализации объекта класса Path :

Пример 1: с использованием функции cwd():

В данном случае путь к директории имеет вид: dir_path = «/home/molodec/python», а полный путь к файлу «docs.txt» будет иметь вид: «/home/molodec/python/files/info/docs.txt».

Представленный выше код можно оптимизировать и записать в одну строку:

Пример2: с использованием функции home():

В данном случае путь к директории имеет вид: dir_path = «/home/molodec», а полный путь к файлу ‘docs.txt’ будет иметь вид: «/home/molodec/files/info/docs.txt».

Сократим представленный выше код:

А почему не os.path.join?

А что же не так с заслуженным мастером по объединению путей os.path.join() и хранителем секретной информации о расположении рабочей директории os.getcwd()? Действительно, эти замечательные функции в составе модуля os довольно долго служили разработчикам Python верой и правдой. Их вполне можно использовать для определения пути к файлу. Однако, большим недостатком функции join() является невозможность принять для объединения более двух аргументов. Таким образом, чтобы присоединить к рабочей директории путь вида: ‘files/info/docs.txt’, приходится трижды обращаться к функции join(), не забывая при этом искусно жонглировать скобками. Выглядит это примерно так:

Казалось бы, ничего сложного. Однако, зачем громоздить лишние скобки, когда есть более лаконичный вариант с использованием модуля pathlib?

Подведем итог: начиная с версии Python 3.4, для задания пути к файлу рекомендуется использовать модуль pathlib с классом Path. Определить путь к рабочей директории можно с помощью функции cwd(), а путь к домашней директории подскажет функция home().

Как мне получить путь к текущему исполняемому файлу в Python?

Это может показаться вопросом новичка, но это не так. Некоторые общие подходы работают не во всех случаях:

Sys.argv [ 0 ]

Это означает использование path = os.path.abspath(os.path.dirname(sys.argv[0])) , но это не работает, если вы работаете из другого скрипта Python в другом каталоге, а это может случиться в реальной жизни.

__файл__

Это означает использование path = os.path.abspath(os.path.dirname(__file__)) , но я обнаружил, что это не работает:

Связанные вопросы с неполными ответами:

Я ищу общее решение , которое подойдет для всех вышеперечисленных вариантов использования.

Обновить

Вот результат теста:

Вывод python a.py (в Windows)

Subdir / b.py

Дерево

13 ответов

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

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

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

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

Во-первых, вам нужно импортировать из inspect и os

Затем, где бы вы ни хотели найти исходный файл, просто используйте

Это решение надежно даже в исполняемых файлах

У меня была аналогичная проблема, и я думаю, что это может решить проблему:

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

Мое типичное использование:

Теперь я использую __modpath__ вместо __file__.

Короткий ответ: нет гарантированного способа получить нужную информацию , однако есть эвристики, которые почти всегда работают на практике. Вы можете посмотреть Как найти расположение исполняемого файла на C? . В нем обсуждается проблема с точки зрения C, но предлагаемые решения легко транскрибируются в Python.

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

Во-первых, вам нужно импортировать части модулей inspect и os .

Затем используйте следующую строку в любом другом месте вашего кода Python:

Как это работает:

Из встроенного модуля os (описание ниже) импортируется инструмент abspath .

Подпрограммы ОС для Mac, NT или Posix в зависимости от того, в какой системе мы работаем.

Затем getsourcefile (описание ниже) импортируется из встроенного модуля inspect .

Получайте полезную информацию из живых объектов Python.

  • abspath(path) возвращает абсолютную / полную версию пути к файлу
  • getsourcefile(lambda:0) каким-то образом получает внутренний исходный файл объекта лямбда-функции, поэтому возвращает ‘
Читайте также  Как открыть файл в формате HTML?

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

Использование abspath в результате getsourcefile(lambda:0) должно гарантировать, что созданный путь к файлу является полным путем к файлу Python.
Это объясненное решение изначально было основано на коде из ответа на Как узнать путь к текущему исполняемому файлу в Python?.

Вы просто позвонили:

abspath() дает вам абсолютный путь к sys.argv[0] (имя файла, в котором находится ваш код), а dirname() возвращает путь к каталогу без имени файла.

Это должно работать кроссплатформенным способом (если вы не используете интерпретатор или что-то в этом роде):

sys.path[0] — это каталог, в котором находится ваш вызывающий скрипт (в первую очередь он ищет модули, которые будут использоваться этим скриптом). Мы можем взять имя самого файла с конца sys.argv[0] (что я и сделал с os.path.basename ). os.path.join просто объединяет их кроссплатформенным способом. os.path.realpath просто гарантирует, что если мы получим какие-либо символические ссылки с другими именами, чем сам скрипт, мы все равно получим настоящее имя скрипта.

У меня нет Mac; Итак, я не тестировал это на одном. Пожалуйста, дайте мне знать, работает ли это так, как кажется. Я тестировал это в Linux (Xubuntu) с Python 3.4. Обратите внимание, что многие решения этой проблемы не работают на Mac (поскольку я слышал, что __file__ отсутствует на Mac).

Обратите внимание, что если ваш сценарий является символической ссылкой, он предоставит вам путь к файлу, на который он ссылается (а не путь к символической ссылке).

Вы можете использовать Path из модуля pathlib :

Вы можете использовать вызов parent , чтобы продолжить путь:

Если код исходит из файла, вы можете получить его полное имя

Как получить полный путь текущего каталога файлов в Python?

Зная, где вы важны, независимо от того, находятся ли вы на открытом воздухе, спотыкаетесь в туалет в середине ночи или просто программирование. Работа с вашего полночь с толку или на открытом воздухе навыки на наличии навыки нахождения на уровне нахождения нахождения на уровне по договорным ценам. 🐍 Метод … Как получить полный путь текущего каталога файлов в Python? Подробнее “

  • Автор записи

Автор: Evan Simmons
Дата записи

Автор оригинала: Evan Simmons.

Зная, где вы важны, независимо от того, находятся ли вы на открытом воздухе, спотыкаетесь в туалет в середине ночи или просто программирование. Работа с вашего полночь с толку или на открытом воздухе навыки на наличии навыки нахождения на уровне нахождения нахождения на уровне по договорным ценам. 🐍

Метод 1: pathlib.cwd ()

Чтобы получить ваш текущий путь в Python, используйте pathlib Модуль в стандартной библиотеке Python и звоните CWD () Это аббревиатура для C Urrent работает Справочник “ . Если вам нужен ваш путь и файл, из которого вы звоните, используете Путь (___ file__) Отказ

Этот код Импорт Путь класс, а Отпечатки рабочий каталог. Путь Класс – это Объектно-ориентированные Подход к работе с вашим путем. Получение вашего текущего рабочего каталога довольно прост, и есть несколько других способов выполнить то же самое.

Способ 2: OS.GETCWD ()

Один старый способ сделать то же самое в Python – использовать OS.Getcwd () , что полезно, если вы хотите взаимодействовать с вашим путем в качестве строки. Кроме того, вы можете запросить глобальный Переменные вашей среды Python.

Теперь этот код говорит вам, что вы работаете. Оба этих примера очень похожи на открытие приглашения оболочки и вызов CWD команда. тем не мение Что, если вы хотите знать, в какой комнате дома вы находитесь, и то, на чем вы работаете?

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

  • 1.) __File__ вызывается при работе в файле. Поэтому он не будет работать, если вы попытаетесь вызвать его из переводчика оболочки.
  • 2.) __File__ Не работает в контексте ноутбука Jupyter, это привело меня к кролику, которую я скоро верю.

Важно знать о __File__ Это то, что он устанавливается переводчиком во время выполнения, так что Python знает, какой файл работает, когда сценарий работает с несколькими модулями. Увеличивается, что звонит Путь (___ file__) Дает вам строку текущего файла, на которой вы работаете, и путь. Если вы хотите, вы можете играть с некоторыми другими методами, такими как .absolute () или .parent () .

Про ошибка ноутбука Jupyter

Я не знаю о тебе Но я очень заинтересовал при звонке __File__ бросил ошибку в моем ноутбуке Jupyter. Я был так заинтересован; Я пошел на след кролика, пытаясь выяснить, почему. В конце концов, иногда приятно иметь расплывчатое представление о том, как работает ваш IDE. Чтобы быть понятным, я использую VS Code Jupyter расширение. Это может быть похоже или отличается от IDE что вы используете.

Я начал пытаться понять, почему __File__ не работал, экспериментируя со следующим кодом:

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

Тем не менее, путь к файлу совершенно неправильно, если я использую VS-код и моего расширения Jupyter. Я делаю всю свою работу под Отказ Этот код вернулся, что он работает из Отказ Что такое Sunnier, в том, что в списке каталогов нет копии моего файла Jupyter. Это должно быть там временно или что-то в этом роде.

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

Следующим шагом было посмотреть на документы Jupyter, чтобы увидеть, как ноутбуки архитектуруются ( https://jupyter.readthedocs.io/ru/latest/projects/architecture/content-architecture.html ).

Это не объясняет точные подробности о том, как работает мой VS-код расширения, но он дает мне представление о том, как записывает ноутбуки Jupyter. На вынос Mayman – это то, что ноутбук Jupyter не является файлом исходного кода, а файл json, который интерпретируется в код и метаданные сервером Jupiter. Сервер выполняет код в месте расположения Jupyter Server, а затем возвращает код и выходы (текстовые или визуальные) на местоположение клиента Jupyter.

Заключение

Это завершает учебник на сегодня. Мораль этой истории состоит в том, что важно знать, в каком каталоге вы работаете и общая задача, к счастью, Python делает это довольно легко. Есть несколько способов найти ваш рабочий каталог, а имя файла, над которым вы работаете. Метод, используемый здесь использование pathlib Очень просто, если вы так желаете, вы можете найти другой более сложный способ выполнить эту задачу. Конечно, ваша среда ОС и развития может сделать это более сложнее, особенно если вы не знаете, как работает ваш IDE или установлен.

Я Python Freelancer и методистский пастор в Сиэтл Вашингтон. Я делаю программирование и служил бездомных центра города. Я также люблю проводить время со своей семьей и отправиться в амбициозные приключения на открытом воздухе.

Борис Аладышкин/ автор статьи

Приветствую! Я являюсь руководителем данного проекта и занимаюсь его наполнением. Здесь я стараюсь собирать и публиковать максимально полный и интересный контент на темы связанные с современными технологиями и программным обеспечением. Уверен вы найдете для себя немало полезной информации. С уважением, Борис Аладышкин.

Понравилась статья? Поделиться с друзьями:
Itsovet61.ru
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: