Как получить полный путь к каталогу текущего файла в Python?
Я хочу получить путь к каталогу текущего файла.
Я старался:
>>> os.path.abspath(__file__)
'C:\\python27\\test.py'
Но как я могу получить путь к каталогу? Например:
'C:\\python27\\'
19 ответов
Если вы имеете в виду каталог запускаемого скрипта:
import os
os.path.dirname(os.path.abspath(__file__))
Если вы имеете в виду текущий рабочий каталог:
import os
os.getcwd()
Обратите внимание, что до и после file
это два подчеркивания, а не только один.
Также обратите внимание, что если вы работаете в интерактивном режиме или загрузили код из чего-то другого, чем файл (например, из базы данных или онлайн-ресурса), __file__
не может быть установлен, так как отсутствует понятие "текущий файл". Ответ выше предполагает наиболее распространенный сценарий запуска скрипта Python, который находится в файле.
В Python 3:
from pathlib import Path
mypath = Path().absolute()
print(mypath)
В Python 3.x я делаю:
from pathlib import Path
path = Path(__file__).parent.absolute()
Объяснение:
Path(__file__)
путь к текущему файлу.parent
дает каталог, в котором находится файл.absolute()
дает вам полный абсолютный путь к нему.
С помощью pathlib
это современный способ работы с дорожками. Если вам по каким-то причинам она понадобится позже, просто сделайте str(path)
,
Попробуй это:
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
Я обнаружил, что все следующие команды возвращают полный путь к родительскому каталогу скрипта Python 3.6.
Скрипт Python 3.6:
#!/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(), Path (file).parent (). Absolute()
ПОЛЕЗНЫЕ СВОЙСТВА ПУТИ В ПИТОНЕ:
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
работает также, если__file__
недоступен (ноутбуки jupyter)
import sys
from pathlib import Path
path_file = Path(sys.path[0])
print(path_file)
Также использует pathlib, который является объектно-ориентированным способом обработки путей в python 3.
Ты можешь использовать os
а также os.path
библиотека легко следующим образом
import os
os.chdir(os.path.dirname(os.getcwd()))
os.path.dirname
возвращает верхний каталог из текущего. Это позволяет нам перейти на более высокий уровень без передачи аргумента файла и без знания абсолютного пути.
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
Питон 2 и 3
Вы также можете просто сделать:
from os import sep
print(__file__.rsplit(sep, 1)[0] + sep)
Что выводит что-то вроде:
C:\my_folder\sub_folder\
Если вы просто хотите увидеть текущий рабочий каталог
import os
print(os.getcwd)
Если вы хотите изменить текущий рабочий каталог
os.chdir(path)
path - это строка, содержащая требуемый путь для перемещения. например
path = "C:\\Users\\xyz\\Desktop\\move here"
Система: MacOS
Версия: Python 3.6 с Анакондой
import os
rootpath = os.getcwd()
os.chdir(rootpath)
Это то, что мне нужно для работы
path = os.getcwd().replace(os.sep, "/")
name = Path(__file__).name
full = str(path) + "/" + str(name)
indv = full.split("/")
Предположим, у вас есть следующая структура каталогов: -
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)
Я сделал функцию для использования при запуске Python под IIS в CGI, чтобы получить текущую папку:
import os
def getLocalFolder():
path=str(os.path.dirname(os.path.abspath(__file__))).split('\\')
return path[len(path)-1]
Чтобы сохранить согласованность миграции между платформами (macOS/Windows/Linux), попробуйте:
path = r'%s' % os.getcwd().replace('\\','/')
## 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
Это можно сделать без модуля.
def get_path():
return (__file__.replace(f"<your script name>.py", ""))
print(get_path())