__file__не определяется при запуске python в качестве интерактивной оболочки. Первый фрагмент кода в вашем вопросе выглядит так, как будто он из интерактивной оболочки, но на самом деле выдает NameError, по крайней мере, на python 2.7.3, но я думаю, что и другие.
import os
os.path.dirname(os.path.abspath(__file__))
Если вы имеете в виду текущий рабочий каталог:
import os
os.path.abspath(os.getcwd())
Обратите внимание, что до и после file - два подчеркивания, а не только одно.
Также обратите внимание, что если вы работаете в интерактивном режиме или загрузили код из чего-то другого, чем файл (например, из базы данных или онлайн-ресурса), __file__ может быть не установлен, так как отсутствует понятие «текущий файл». Ответ выше предполагает наиболее распространенный сценарий запуска скрипта Python, который находится в файле.
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 importPathprint("File Path:",Path(__file__).absolute())print("Directory Path:",Path().absolute())
Я должен был сделать, 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 importPath
path =Path(__file__).parent.absolute()
Объяснение:
Path(__file__) путь к текущему файлу
.parentдает каталог, в котором находится файл
.absolute()дает вам полный абсолютный путь к нему.
Использование pathlib- это современный способ работы с путями. Если вам по каким-то причинам это понадобится позже, просто сделайте это str(path).
Это должно быть общепринятым ответ от 2019. Одна вещи может быть упомянут в ответе, а: можно сразу позвонить .open()по такому Pathобъекту , как вwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
Извините, но этот ответ неверен, правильный ответ сделан Брайаном `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возвращает верхний каталог из текущего. Это позволяет нам перейти на более высокий уровень без передачи аргумента файла и без знания абсолютного пути.
Это не дает каталог текущего файла . Он возвращает каталог текущего рабочего каталога, который может быть совершенно другим. То, что вы предлагаете, работает, только если файл находится в текущем рабочем каталоге.
Брайан Оукли
4
Попробуй это:
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
from pathlib importPath#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
@ Киро, мое решение отвечает на вопрос с помощью IPython. Например, если кто-то отвечает на вопрос с помощью решения, используя новую библиотеку, то также imho, он остается подходящим ответом на вопрос.
Нафиез Кураиши
@NafeezQuraishi - ваше решение представляет стороннюю библиотеку и класс, из которого вы должны создать экземпляр для достижения желаемого результата. Я сам, и я думаю, что многие другие стараются избегать использования внешних библиотек по ряду причин, и я бы попробовал ваше решение, только если бы ничего больше не работало. К счастью, есть ряд встроенных функций, которые вы можете использовать для получения желаемого результата, без необходимости использования внешней библиотеки.
elliotwesoff
@ elli0t, частично согласен. Представьте, что у кого-то, использующего ноутбук Jupyter, есть этот вопрос, для которого, возможно, использование команды% pwd magic было бы проще и предпочтительнее, чем импорт os.
Нафиез Кураиши
0
Чтобы сохранить согласованность миграции между платформами (macOS / Windows / Linux), попробуйте:
## IMPORT MODULESimport os
## CALCULATE FILEPATH VARIABLE
filepath = os.path.abspath('')## ~ os.getcwd()## TEST TO MAKE SURE os.getcwd() is EQUIVALENT ALWAYS..## ..OR DIFFERENT IN SOME CIRCUMSTANCES
Текущий рабочий каталог может не совпадать с каталогом текущего файла. Ваше решение будет работать, только если текущий рабочий каталог совпадает с каталогом, в котором находится файл. Это может быть довольно распространенным явлением во время разработки, но обычно это довольно редко для развернутого скрипта.
Брайан Оукли
Спасибо за информацию. Я обновил свой ответ, чтобы отразить возможность того, что они не могут быть эквивалентными, возвращая один и тот же путь к файлу. По этой причине я придерживаюсь философии кодирования, называемой «инкрементным программированием», тестированием и множеством вызовов функции print () для проверки выходных данных и / или значений, возвращаемых на каждом этапе пути. Я надеюсь, что мой код теперь лучше отражает реальность os.path.abspath () против os.getcwd (), поскольку я не претендую на то, что знаю все. Однако вы можете заметить, что я добавил os.getcwd () в комментарии не как основное решение, а как альтернативный фрагмент кода, который стоит запомнить и проверить.
Иерусалимский программист
PS Я думаю, что кто-то отредактировал и удалил большую часть моего ответа, который я разместил здесь ... :( Такие отговаривают людей участвовать, если их ответы будут подвергнуты цензуре и
Иерусалимский программист
1
Вы единственный человек, который отредактировал этот ответ. Кроме того, ваши изменения по-прежнему не отвечают должным образом на вопрос. Вопрос, в частности, касается вопроса о пути к каталогу файла, а в вашем ответе упоминается только получение текущего каталога. Это неправильный ответ, поскольку текущий каталог очень часто не совпадает с каталогом, в котором находится скрипт. Это не имеет ничего общего abspath.
Брайан Оукли
Скорее всего, код, которым я поделился, дает путь к каталогу файла, если он запускается из каталога и / или файла, откуда вы хотите знать абсолютный путь к файлу. Наверняка это правильный ответ. Пожалуйста, не будь троллем.
__file__
не определяется при запуске python в качестве интерактивной оболочки. Первый фрагмент кода в вашем вопросе выглядит так, как будто он из интерактивной оболочки, но на самом деле выдаетNameError
, по крайней мере, на python 2.7.3, но я думаю, что и другие.Ответы:
Python 3
Для каталога запускаемого скрипта:
Для текущего рабочего каталога:
Python 2 и 3
Для каталога запускаемого скрипта:
Если вы имеете в виду текущий рабочий каталог:
Обратите внимание, что до и после
file
- два подчеркивания, а не только одно.Также обратите внимание, что если вы работаете в интерактивном режиме или загрузили код из чего-то другого, чем файл (например, из базы данных или онлайн-ресурса),
__file__
может быть не установлен, так как отсутствует понятие «текущий файл». Ответ выше предполагает наиболее распространенный сценарий запуска скрипта Python, который находится в файле.Ссылки
источник
__file__
(обратите внимание, что это два подчеркивания с каждой стороны слова) является стандартной частью Python. Например, он недоступен в модулях на основе Си, но всегда должен быть доступен в скрипте Python.__file__
если работает из интерактивной подсказки. \Использование
Path
рекомендуется в Python 3:Документация: pathlib
Примечание. При использовании ноутбука Jupyter
__file__
не возвращает ожидаемое значение, поэтомуPath().absolute()
его следует использовать.источник
Path(__file__).parent
чтобы получить папку, которая содержит файлPath(__file__)
получает файл..parent
получает вас на один уровень выше, то есть содержащий каталог. Вы можете добавить больше.parent
к этому, чтобы перейти на столько каталогов, сколько вам нужно.Path().absolute()
существовал в каком-то модуле, расположенном в,path/to/module
и выpath/to/script
path/to/script
path/to/module
Path(__file__).cwd()
более явныйPath(__file__)
например, не всегда работает в Jupyter Notebook.Path().absolute()
решает эту проблему.В Python 3.x я делаю:
Объяснение:
Path(__file__)
путь к текущему файлу.parent
дает каталог, в котором находится файл.absolute()
дает вам полный абсолютный путь к нему.Использование
pathlib
- это современный способ работы с путями. Если вам по каким-то причинам это понадобится позже, просто сделайте этоstr(path)
.источник
.open()
по такомуPath
объекту , как вwith Path(__file__).parent.joinpath('some_file.txt').open() as f:
источник
/
как выходнойВы можете использовать
os
иos.path
легко библиотека следующим образомos.path.dirname
возвращает верхний каталог из текущего. Это позволяет нам перейти на более высокий уровень без передачи аргумента файла и без знания абсолютного пути.источник
Попробуй это:
источник
Я обнаружил, что все следующие команды возвращают полный путь родительского каталога скрипта Python 3.6.
Python 3.6 Script:
Пояснения ссылки: .resolve () , .absolute () , путь ( файл ) .parent (). Absolute ()
источник
Система: MacOS
Версия: Python 3.6 с Анакондой
источник
ПОЛЕЗНЫЕ СВОЙСТВА ПУТИ В ПИТОНЕ:
РЕЗУЛЬТАТ : АБСОЛЮТНЫЙ ПУТЬ - это ПУТЬ, ГДЕ РАЗМЕЩЕН ВАЙ ФАЙЛ ПИТОНА
Абсолютный путь: 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
источник
Если вы просто хотите увидеть текущий рабочий каталог
Если вы хотите изменить текущий рабочий каталог
путь - это строка, содержащая требуемый путь для перемещения. например
источник
IPython
имеет магическую команду,%pwd
чтобы получить текущий рабочий каталог. Может использоваться следующим образом:На IPython Jupyter Notebook
%pwd
можно использовать напрямую следующим образом:источник
Чтобы сохранить согласованность миграции между платформами (macOS / Windows / Linux), попробуйте:
источник
Я сделал функцию для использования при запуске Python под IIS в CGI, чтобы получить текущую папку:
источник
Предположим, у вас есть следующая структура каталогов:
main / fold1 fold2 fold3 ...
источник
источник
abspath
.