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


808

Я хочу получить путь к каталогу текущего файла. Я старался:

>>> os.path.abspath(__file__)
'C:\\python27\\test.py'

Но как я могу получить путь к каталогу?

Например:

'C:\\python27\\'


5
__file__не определяется при запуске python в качестве интерактивной оболочки. Первый фрагмент кода в вашем вопросе выглядит так, как будто он из интерактивной оболочки, но на самом деле выдает NameError, по крайней мере, на python 2.7.3, но я думаю, что и другие.
drevicko

Ответы:


1639

Python 3

Для каталога запускаемого скрипта:

import pathlib
pathlib.Path(__file__).parent.absolute()

Для текущего рабочего каталога:

import pathlib
pathlib.Path().absolute()

Python 2 и 3

Для каталога запускаемого скрипта:

import os
os.path.dirname(os.path.abspath(__file__))

Если вы имеете в виду текущий рабочий каталог:

import os
os.path.abspath(os.getcwd())

Обратите внимание, что до и после file - два подчеркивания, а не только одно.

Также обратите внимание, что если вы работаете в интерактивном режиме или загрузили код из чего-то другого, чем файл (например, из базы данных или онлайн-ресурса), __file__ может быть не установлен, так как отсутствует понятие «текущий файл». Ответ выше предполагает наиболее распространенный сценарий запуска скрипта Python, который находится в файле.

Ссылки

  1. pathlib в документации по питону .
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. что означает переменная __file__ / делает?

43
abspath () обязателен, если вы не хотите обнаруживать странное поведение в окнах, где dirname ( файл ) может возвращать пустую строку!
сорин

4
должно быть os.path.dirname (os.path.abspath (os .__ file__))?
DrBailey

5
@DrBailey: нет, в ActivePython нет ничего особенного. __file__(обратите внимание, что это два подчеркивания с каждой стороны слова) является стандартной частью Python. Например, он недоступен в модулях на основе Си, но всегда должен быть доступен в скрипте Python.
Брайан Оукли

10
Я бы рекомендовал использовать realpath вместо abspath для разрешения возможной символической ссылки.
TTimo

12
@ cph2117: это будет работать, только если вы запустите его в скрипте. Нет, __file__если работает из интерактивной подсказки. \
Брайан Оукли

99

Использование Pathрекомендуется в Python 3:

from pathlib import Path
print("File      Path:", Path(__file__).absolute())
print("Directory Path:", Path().absolute())  

Документация: pathlib

Примечание. При использовании ноутбука Jupyter __file__не возвращает ожидаемое значение, поэтому Path().absolute()его следует использовать.


17
Я должен был сделать, Path(__file__).parentчтобы получить папку, которая содержит файл
YellowPillow

Это правильно @YellowPillow, Path(__file__)получает файл. .parentполучает вас на один уровень выше, то есть содержащий каталог. Вы можете добавить больше .parentк этому, чтобы перейти на столько каталогов, сколько вам нужно.
Рон Калян

1
Извините, я должен был сделать это более понятным, но если бы он Path().absolute()существовал в каком-то модуле, расположенном в, path/to/moduleи вы path/to/scriptpath/to/scriptpath/to/module
вызывали

1
@YellowPillow Path(__file__).cwd()более явный
Чарльз

1
Path(__file__)например, не всегда работает в Jupyter Notebook. Path().absolute()решает эту проблему.
Рон

43

В Python 3.x я делаю:

from pathlib import Path

path = Path(__file__).parent.absolute()

Объяснение:

  • Path(__file__) путь к текущему файлу
  • .parentдает каталог, в котором находится файл
  • .absolute()дает вам полный абсолютный путь к нему.

Использование pathlib- это современный способ работы с путями. Если вам по каким-то причинам это понадобится позже, просто сделайте это str(path).


3
Это должно быть общепринятым ответ от 2019. Одна вещи может быть упомянут в ответе, а: можно сразу позвонить .open()по такому Pathобъекту , как вwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
stefanct

9
import os
print os.path.dirname(__file__)

21
Извините, но этот ответ неверен, правильный ответ сделан Брайаном `dirname (abspath ( file )). Смотрите комментарии для деталей.
сорин

1
Это даст / как выходной
Tripathi29

2
@sorin На самом деле на Python 3.6 они оба одинаковые
DollarAkshay

5

Вы можете использовать osи os.pathлегко библиотека следующим образом

import os
os.chdir(os.path.dirname(os.getcwd()))

os.path.dirnameвозвращает верхний каталог из текущего. Это позволяет нам перейти на более высокий уровень без передачи аргумента файла и без знания абсолютного пути.


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


2

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

Python 3.6 Script:

#!/usr/bin/env python3.6
# -*- coding: utf-8 -*-

from pathlib import Path

#Get the absolute path of a Python3.6 script
dir1 = Path().resolve()  #Make the path absolute, resolving any symlinks.
dir2 = Path().absolute() #See @RonKalian answer 
dir3 = Path(__file__).parent.absolute() #See @Arminius answer 

print(f'dir1={dir1}\ndir2={dir2}\ndir3={dir3}')

Пояснения ссылки: .resolve () , .absolute () , путь ( файл ) .parent (). Absolute ()



1

ПОЛЕЗНЫЕ СВОЙСТВА ПУТИ В ПИТОНЕ:

 from pathlib import Path

    #Returns the path of the directory, where your script file is placed
    mypath = Path().absolute()
    print('Absolute path : {}'.format(mypath))

    #if you want to go to any other file inside the subdirectories of the directory path got from above method
    filePath = mypath/'data'/'fuel_econ.csv'
    print('File path : {}'.format(filePath))

    #To check if file present in that directory or Not
    isfileExist = filePath.exists()
    print('isfileExist : {}'.format(isfileExist))

    #To check if the path is a directory or a File
    isadirectory = filePath.is_dir()
    print('isadirectory : {}'.format(isadirectory))

    #To get the extension of the file
    fileExtension = mypath/'data'/'fuel_econ.csv'
    print('File extension : {}'.format(filePath.suffix))

РЕЗУЛЬТАТ : АБСОЛЮТНЫЙ ПУТЬ - это ПУТЬ, ГДЕ РАЗМЕЩЕН ВАЙ ФАЙЛ ПИТОНА

Абсолютный путь: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2

Путь к файлу: D: \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib and seaborn Part2 \ data \ fuel_econ.csv

isfileExist: True

isadirectory: False

Расширение файла: .csv


1

Если вы просто хотите увидеть текущий рабочий каталог

import os
print(os.getcwd)

Если вы хотите изменить текущий рабочий каталог

os.chdir(path)

путь - это строка, содержащая требуемый путь для перемещения. например

path = "C:\\Users\\xyz\\Desktop\\move here"

0

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

from IPython.terminal.embed import InteractiveShellEmbed

ip_shell = InteractiveShellEmbed()

present_working_directory = ip_shell.magic("%pwd")

На IPython Jupyter Notebook %pwdможно использовать напрямую следующим образом:

present_working_directory = %pwd

5
Вопрос не об IPython
Kiro

1
@ Киро, мое решение отвечает на вопрос с помощью IPython. Например, если кто-то отвечает на вопрос с помощью решения, используя новую библиотеку, то также imho, он остается подходящим ответом на вопрос.
Нафиез Кураиши

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

@ elli0t, частично согласен. Представьте, что у кого-то, использующего ноутбук Jupyter, есть этот вопрос, для которого, возможно, использование команды% pwd magic было бы проще и предпочтительнее, чем импорт os.
Нафиез Кураиши

0

Чтобы сохранить согласованность миграции между платформами (macOS / Windows / Linux), попробуйте:

path = r'%s' % os.getcwd().replace('\\','/')

0

Я сделал функцию для использования при запуске Python под IIS в CGI, чтобы получить текущую папку:

import os 
   def getLocalFolder():
        path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
        return path[len(path)-1]

0

Предположим, у вас есть следующая структура каталогов:

main / fold1 fold2 fold3 ...

folders = glob.glob("main/fold*")

for fold in folders:
    abspath = os.path.dirname(os.path.abspath(fold))
    fullpath = os.path.join(abspath, sch)
    print(fullpath)

-1
## IMPORT MODULES
import os

## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('') ## ~ os.getcwd()
## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..
## ..OR DIFFERENT IN SOME CIRCUMSTANCES

2
Текущий рабочий каталог может не совпадать с каталогом текущего файла. Ваше решение будет работать, только если текущий рабочий каталог совпадает с каталогом, в котором находится файл. Это может быть довольно распространенным явлением во время разработки, но обычно это довольно редко для развернутого скрипта.
Брайан Оукли

Спасибо за информацию. Я обновил свой ответ, чтобы отразить возможность того, что они не могут быть эквивалентными, возвращая один и тот же путь к файлу. По этой причине я придерживаюсь философии кодирования, называемой «инкрементным программированием», тестированием и множеством вызовов функции print () для проверки выходных данных и / или значений, возвращаемых на каждом этапе пути. Я надеюсь, что мой код теперь лучше отражает реальность os.path.abspath () против os.getcwd (), поскольку я не претендую на то, что знаю все. Однако вы можете заметить, что я добавил os.getcwd () в комментарии не как основное решение, а как альтернативный фрагмент кода, который стоит запомнить и проверить.
Иерусалимский программист

PS Я думаю, что кто-то отредактировал и удалил большую часть моего ответа, который я разместил здесь ... :( Такие отговаривают людей участвовать, если их ответы будут подвергнуты цензуре и
Иерусалимский программист

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

Скорее всего, код, которым я поделился, дает путь к каталогу файла, если он запускается из каталога и / или файла, откуда вы хотите знать абсолютный путь к файлу. Наверняка это правильный ответ. Пожалуйста, не будь троллем.
Программист из Иерусалима
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.