Як отримати повний шлях до каталогу поточного файлу?


800

Я хочу отримати шлях до каталогу поточного файлу. Я намагався:

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

Але як я можу отримати шлях до каталогу?

Наприклад:

'C:\\python27\\'

4
можливий дублікат Find
the

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

Відповіді:


1629

Пітон 3

Для каталогу запущеного сценарію:

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

Для поточного робочого каталогу:

import pathlib
pathlib.Path().absolute()

Пітон 2 і 3

Для каталогу запущеного сценарію:

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

Якщо ви маєте на увазі поточний робочий каталог:

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

Зауважте, що до і після fileє дві підкреслення, а не лише одна.

Також зауважте, що якщо ви працюєте в інтерактивному режимі або завантажили код з чогось іншого, ніж файл (наприклад: база даних або Інтернет-ресурс), __file__можливо, його не можна встановити, оскільки немає поняття "поточний файл". Наведена вище відповідь передбачає найпоширеніший сценарій запуску сценарію python, який знаходиться у файлі.

Список літератури

  1. pathlib в документації python.
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. що означає / робить змінну __file__?

43
abspath () є обов'язковим, якщо ви не хочете виявляти дивні поведінки у Windows, де dirname ( файл ) може повернути порожню рядок!
sorin

4
має бути os.path.dirname (os.path.abspath (os .__ файл__))?
DrBailey

5
@DrBailey: ні, в ActivePython немає нічого особливого. __file__(зауважте, що це два підкреслення з обох боків слова) є стандартною частиною пітона. Наприклад, він не доступний у модулях на основі С, але він завжди повинен бути доступний у сценарії 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 Notebook, __file__він не повертає очікуваного значення, тому Path().absolute()його потрібно використовувати.


17
Мені довелося Path(__file__).parentдістати папку, яка містить файл
YellowPillow

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

1
Вибачте, я мав би зробити це зрозумілішим, але якщо Path().absolute()існує в якомусь модулі, розташованому на, path/to/moduleі ви викликаєте модуль із якогось сценарію, розташованого в path/to/scriptтой час, повернеться path/to/scriptзамістьpath/to/module
YellowPillow

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 ( файл )). Деталі див. У коментарях.
sorin

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:

#!/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 ( файл ) .parent (). Абсолютний ()


2

Система: MacOS

Версія: Python 3,6 Вт / Анаконда

import os

rootpath = os.getcwd()

os.chdir(rootpath)

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: \ Навчання \ Машинне навчання \ Блокнот Юпітора \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib та seaborn Part2

Шлях до файлу: D: \ Навчання \ Машинне навчання \ Блокнот Юпітора \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib та новонароджений Part2 \ data \ fuel_econ.csv

isfileExist: Правда

керівництво: Неправдиво

Розширення файлу: .csv


1

Якщо ви просто хочете переглянути поточний робочий каталог

import os
print(os.getcwd)

Якщо ви хочете змінити поточний робочий каталог

os.chdir(path)

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
Кіро

1
@Kiro, моє рішення відповідає на питання за допомогою IPython. Наприклад, якщо хтось відповідає на питання із рішенням, використовуючи нову бібліотеку, то також imho, це залишається доречною відповіддю на питання.
Nafeez Quraishi

@NafeezQuraishi ваше рішення представляє сторонні бібліотеки та клас, з якого вам потрібно інстанціювати, щоб досягти бажаного результату. Я сам, і я думаю, що багато інших намагаються уникати використання зовнішніх бібліотек з ряду причин, і я б спробував ваше рішення, лише якщо нічого іншого не вийшло. На щастя, існує низка вбудованих функцій, які можна використовувати для отримання бажаного результату і без необхідності зовнішньої бібліотеки.
elliotwesoff

@ elli0t, частково згоден. Подумайте, що хтось, який використовує ноутбук Юпітера, має це питання, для кого, можливо, використання магічної команди% pwd було б простішим і кращим над імпортом OS.
Nafeez Quraishi

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

Припустимо, у вас є така структура каталогу: -

основна / складча1 складка2 складка3 ...

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.