현재 파일 디렉토리의 전체 경로는 어떻게 얻습니까?


800

현재 파일의 디렉토리 경로를 가져오고 싶습니다. 나는 시도했다 :

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

그러나 디렉토리의 경로를 어떻게 검색 할 수 있습니까?

예를 들면 다음과 같습니다.

'C:\\python27\\'


5
__file__파이썬을 대화식 쉘로 실행할 때는 정의되지 않습니다. 귀하의 질문에있는 첫 번째 코드는 대화 형 셸에서 나온 것처럼 보이지만 실제로는 NameErrorPython 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__ "현재 파일"이라는 개념이 없으므로 설정되지 않을 수 있습니다. 위의 답변은 파일에있는 파이썬 스크립트를 실행하는 가장 일반적인 시나리오를 가정합니다.

참고 문헌

  1. 파이썬 문서의 pathlib .
  2. os.path 2.7 , os.path 3.8
  3. os.getcwd 2.7 , os.getcwd 3.8
  4. __file__ 변수는 무엇을 의미합니까?

43
dirname ( file )이 빈 문자열을 반환 할 수 있는 Windows에서 이상한 동작을 발견하지 않으려면 abspath ()가 필수입니다 !
sorin

4
os.path.dirname (os.path.abspath (os .__ file__))이어야합니까?
DrBailey

5
@ DrBailey : 아니요, ActivePython에는 특별한 것이 없습니다. __file__(단어의 양쪽에 두 개의 밑줄이 있음)은 파이썬의 표준 부분입니다. 예를 들어 C 기반 모듈에서는 사용할 수 없지만 항상 파이썬 스크립트에서 사용할 수 있어야합니다.
Bryan Oakley

10
가능한 심볼릭 링크를 해결하기 위해 abspath 대신 realpath를 사용하는 것이 좋습니다.
TTimo

12
@ cph2117 : 스크립트에서 실행할 때만 작동합니다. __file__대화식 프롬프트에서 실행중인 경우 에는 없습니다 . \
Bryan Oakley

99

PathPython 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그것에 더 많은 디렉토리를 추가 하여 필요한만큼 디렉토리를 올라갈 수 있습니다 .
Ron Kalian

1
죄송합니다.이 부분을 더 명확하게해야합니다. 그러나 Path().absolute()일부 모듈에 path/to/module있고 일부 스크립트에서 모듈을 호출하는 경우 대신 대신에 path/to/script반환 path/to/script됩니다.path/to/module
YellowPillow

1
@YellowPillow Path(__file__).cwd()가 더 명시 적입니다
Charles가

1
Path(__file__)예를 들어 Jupyter Notebook에서 작동하지 않는 등 항상 작동하지는 않습니다. Path().absolute()그 문제를 해결합니다.
Ron Kalian

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
죄송하지만이 답변은 정확하지 않습니다. 정답은 Bryan`dirname (abspath ( file ))이 만든 것입니다. 자세한 내용은 의견을 참조하십시오.
sorin

1
그것은 / 출력으로 줄 것이다
Tripathi29

2
@sorin 실제로 파이썬 3.6에서는 둘 다 같습니다
DollarAkshay

5

다음과 같이 쉽게 사용 os하고 os.path라이브러리 할 수 있습니다

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

os.path.dirname현재 디렉토리에서 상위 디렉토리를 반환합니다. 파일 인수를 전달하지 않고 절대 경로를 몰라도 상위 수준으로 변경할 수 있습니다.


7
현재 파일 의 디렉토리는 제공하지 않습니다 . 완전히 다른 현재 작업 디렉토리의 디렉토리를 리턴합니다. 파일이 현재 작업 디렉토리에있는 경우에만 제안합니다.
Bryan Oakley


2

다음 명령이 모두 Python 3.6 스크립트의 부모 디렉토리의 전체 경로를 반환한다는 것을 알았습니다.

파이썬 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 ()


2

시스템 : MacOS

버전 : Python 3.6 w / Anaconda

import os

rootpath = os.getcwd()

os.chdir(rootpath)

1

PyTHON의 유용한 경로 속성 :

 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))

산출: 절대 경로는 PYTHON 파일이 위치한 경로입니다.

절대 경로 : D : \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib 및 seaborn Part2

파일 경로 : D : \ Study \ Machine Learning \ Jupitor Notebook \ JupytorNotebookTest2 \ Udacity_Scripts \ Matplotlib 및 seaborn Part2 \ data \ fuel_econ.csv

isfileExist : True

isadirectory : 거짓

파일 확장자 : .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에 관한 것이 아닙니다
Kiro

1
@Kiro, 내 솔루션 IPython을 사용 하여 질문에 대답합니다 . 예를 들어 어떤 사람이 새로운 라이브러리를 사용하여 솔루션으로 질문에 대답하면 질문에 대한 적절한 답변으로 남아 있습니다.
Nafeez Quraishi

@NafeezQuraishi는 솔루션에 타사 라이브러리 및 원하는 결과를 얻기 위해 인스턴스화 해야하는 클래스를 소개합니다. 나 자신과 많은 다른 사람들이 여러 가지 이유로 외부 라이브러리를 사용하지 않으려 고 생각하지만 다른 것이 효과가 없다면 해결책을 시도 할 것입니다. 다행히 외부 라이브러리 없이도 원하는 결과를 얻는 데 사용할 수있는 일련의 내장 함수가 있습니다.
elliotwesoff

@ elli0t는 부분적으로 동의합니다. Jupyter 노트북을 사용하는 사람 이이 질문에 % pwd magic 명령을 사용하는 것이 os import보다 쉽고 바람직하다고 생각하십시오.
Nafeez Quraishi

0

플랫폼 (macOS / Windows / Linux)에서 마이그레이션 일관성을 유지하려면 다음을 시도하십시오.

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

0

현재 폴더를 얻기 위해 CGI의 IIS에서 파이썬을 실행할 때 사용할 기능을 만들었습니다.

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
현재 작업 디렉토리는 현재 파일의 디렉토리와 같지 않을 수 있습니다. 현재 작업 디렉토리가 파일을 보유한 디렉토리와 동일한 경우에만 솔루션이 작동합니다. 이는 개발 과정에서 매우 일반적 일 수 있지만 일반적으로 배포 된 스크립트에서는 매우 드 rare니다.
Bryan Oakley

정보에 대해서 감사드립니다. 동일한 파일 경로를 반환하는 것과 같지 않을 가능성을 반영하여 답변을 업데이트했습니다. 이것이 바로 "증분 프로그래밍"이라고 불리는 코딩 철학, 테스트 및 출력 및 / 또는 각 단계에서 값을 반환하기위한 많은 print () 함수 호출을 고수하는 이유입니다. 모든 코드를 알고 있다고 주장하지 않으므로 코드에 os.path.abspath () 대 os.getcwd ()의 현실이 더 잘 반영되기를 바랍니다. 그러나 주석에 os.getcwd ()를 주요 솔루션이 아니라 기억하고 확인해야 할 대체 코드로 넣은 것을 알 수 있습니다.
예루살렘 프로그래머

추신 : 나는 누군가 내가 여기에 게시 한 대부분의 답변을 편집하고 지운 것으로 생각합니다 ... :( 그러면 사람들의 답변이 검열되고 잘릴 경우 참여하지 못하게됩니다.
Jerusalem Programmer

1
이 답변을 편집 한 사람은 귀하뿐입니다. 또한 수정 사항이 여전히 질문에 올바르게 답변되지 않습니다. 질문은 구체적으로 파일 디렉토리의 경로에 대해 묻고 있으며 대답은 현재 디렉토리를 얻는 것에 대해서만 언급합니다. 현재 디렉토리는 종종 스크립트가있는 디렉토리와 동일하지 않기 때문에 정답은 아닙니다. 이것은와 관련이 없습니다 abspath.
Bryan Oakley

가장 확실하게 내가 공유 한 코드는 디렉토리 및 / 또는 절대 파일 경로를 알고 싶은 파일에서 실행하는 경우 파일의 디렉토리 경로를 제공합니다. 가장 확실한 답변입니다. 트롤이되지 마십시오.
예루살렘 프로그래머 19
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.