파이썬에서 절대 파일 경로를 얻는 방법


723

과 같은 경로가 주어지면 "mydir/myfile.txt"파이썬에서 현재 작업 디렉토리와 관련된 파일의 절대 경로를 어떻게 찾을 수 있습니까? 예를 들어 Windows의 경우 다음과 같이 끝날 수 있습니다.

"C:/example/cwd/mydir/myfile.txt"

답변:


1054
>>> import os
>>> os.path.abspath("mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

이미 절대 경로 인 경우에도 작동합니다.

>>> import os
>>> os.path.abspath("C:/example/cwd/mydir/myfile.txt")
'C:/example/cwd/mydir/myfile.txt'

29
참고 : 대부분의 플랫폼에서 이는 normpath()다음과 같이 함수를 호출하는 것과 같습니다 normpath(join(os.getcwd(), path)). 따라서 mydir/myfile.txt아래에 있지 않으면 os.getcwd()절대 경로는 실제 경로아닙니다 .
coanor

32
@coanor? 명시 적 루트가 없으면 mydir/myfile.txt, 현재 작업 디렉토리 내부의 경로를 암시 적으로 참조합니다 ./mydir/myfile.txt. 그것은 입력하려는 경로가 아닐 수도 있지만 내가 알 수있는 한 경로를 올바르게 해석하는 것처럼 보입니다. 좀 더 자세히 설명해 주시겠습니까?
jpmc26

2
@ jpmc26 나는 coanor를 정확하게 따르지 않지만 (내가 추정 한 것과는 달리) abspath함수에 대한 인수 와 실제 파일 사이에는 연관성이 없다고 말할 것 입니다. 존재하지 않는 파일 이름과 디렉토리 계층 구조를 지정하면 경로가 간단하게 경로의 비트 (부모 디렉토리 " .."요소 포함)를 확인하고 문자열을 반환합니다. 이것은 현재 디렉토리에서 계산 된 문자열입니다. 실제 파일과의 상관 관계는 우연히 보입니다. 시도하십시오 os.path.abspath("/wow/junk/../blha/hooey"). 효과가있다.
Mike S

2
@MikeS 나는 그것이 왜 예기치 않은 행동인지 솔직히 확신하지 못한다. 절대 파일 또는 디렉토리가 아닌 절대 경로 입니다. 존재 확인을 원하면으로 전화하십시오 os.path.exists. 반대로 표준 경로 확인 기능이있는 기존 경로를 요구하는 PowerShell과 같은 시스템은 사용하기가 어렵습니다.
jpmc26

1
@ jpmc26 경로가 경로 이름처럼 보이는 문자열이라고 가정하는 것은 전혀 명확하지 않으며 수년 동안 경로 이름을 생각하고 말한 방식에 반합니다. abspath에 대한 Python 3 문서를 인용합니다. "정규화 된 절대 버전의 경로 이름 경로를 반환하십시오 ." "... 문자열 경로의 버전"이 아닙니다 . Posix에서 정의한 경로 이름은 "파일을 식별하는 데 사용되는 문자열"입니다. 파이썬 문서는 relpath"파일 시스템이 존재 또는 본질을 확인하기 위해 액세스되지 않습니다"라는 명시 적 path입니다. 여기서 논쟁이 명백하다면 왜 명시 적이어야 relpath하는가?
Mike S

77

새로운 Python 3.4 라이브러리를 사용할 수 있습니다 pathlib. (당신은 또한 사용하여 파이썬 2.6 또는 2.7을 얻을 수 있습니다 pip install pathlib.) 저자는 썼다 : ".이 라이브러리의 목적은 핸들 파일 시스템 경로와 사용자가 그들을 수행 일반적인 작업에 클래스의 간단한 계층 구조를 제공하는 것입니다"

Windows에서 절대 경로를 얻으려면

>>> from pathlib import Path
>>> p = Path("pythonw.exe").resolve()
>>> p
WindowsPath('C:/Python27/pythonw.exe')
>>> str(p)
'C:\\Python27\\pythonw.exe'

또는 UNIX의 경우 :

>>> from pathlib import Path
>>> p = Path("python3.4").resolve()
>>> p
PosixPath('/opt/python3/bin/python3.4')
>>> str(p)
'/opt/python3/bin/python3.4'

문서는 다음과 같습니다. https://docs.python.org/3/library/pathlib.html


4
매우 도움이됩니다. 를 사용 os.path.abspath()하면 오류가 발생했습니다. AttributeError: 'NoneType' object has no attribute 'startswith', 사용 Path().resolve()하면 동일한 상대 파일 경로가 아닙니다. (Linux 및 Python3.4)
NuclearPeon

23

더 나은 방법으로, 모듈 (에있는 PyPI)을 설치 os.path하면 문자열이 사용되는 모든 곳에서 사용할 수있는 객체의 메소드로 모든 기능 및 기타 관련 기능을 래핑합니다 .

>>> from path import path
>>> path('mydir/myfile.txt').abspath()
'C:\\example\\cwd\\mydir\\myfile.txt'
>>>

2
너무 나쁜 그들은 stdlib에 적절한 파일 이름 추상화 모듈을 얻지 못했습니다.
Torsten Marek

1
@ Torsten Marek : 그것은 아프고 오랜 생략입니다.
흐름

4
그들은 이제 Python 3.4를 위해했습니다 : pathlib. 이 글에서 나의 대답을보십시오.
twasbrillig

이 답변에는 yypos가 있습니다. 그것은해야 from path import Path다음Path('mydir/myfile.txt').abspath()
frakman1

오타가 없습니다 path. 다른 모듈을 사용했을 수 있습니다 . 연결된 모듈은이라는 클래스를 사용합니다 path.
Tom


10

pathlib실제로 질문에 대답하는 Python 3.4 이상 업데이트 :

from pathlib import Path

relative = Path("mydir/myfile.txt")
absolute = relative.absolute()  # absolute is a Path object

임시 문자열 만 필요한 경우 다음을 포함 Path하여 관련 기능이 모두 포함 된 객체를 사용할 수 있습니다 .os.pathabspath

from os.path import abspath

absolute = abspath(relative)  # absolute is a str object

9
import os
os.path.abspath(os.path.expanduser(os.path.expandvars(PathNameString)))

참고 expanduser경우에 (유닉스) 파일 (또는 디렉토리) 이름과 선도적 포함 할 수있다 위치에 대한 주어진식이 필요하다 ~/(물결표를 사용자의 홈 디렉토리를 참조), 그리고 expandvars다른 환경 변수 (등을 담당 $HOME).


6

이것은 항상 이 다른 스크립트 내에서 호출 된 경우에도, 현재 스크립트의 오른쪽에 파일 이름을 가져옵니다. 를 사용할 때 특히 유용합니다 subprocess.

import sys,os

filename = sys.argv[0]

거기에서 다음을 사용하여 스크립트의 전체 경로를 얻을 수 있습니다.

>>> os.path.abspath(filename)
'/foo/bar/script.py'

또한 /..디렉토리 계층에서 '위로'이동하려는 횟수만큼 추가하여 폴더를 쉽게 탐색 할 수 있습니다.

암호를 얻으려면 :

>>> os.path.abspath(filename+"/..")
'/foo/bar'

부모 경로의 경우 :

>>> os.path.abspath(filename+"/../..")
'/foo'

"/.."다른 파일 이름과 결합 하면 시스템의 모든 파일에 액세스 할 수 있습니다.


이것은 요청 된 것이 아닙니다. 그들은 현재 작업 디렉토리와 관련된 경로를 물었습니다. 스크립트 디렉토리와 같은 것은 아니지만 때로는 같은 값을 가질 수도 있습니다.
창조의 원소

3

모듈 os은 abs 경로를 찾는 방법을 제공합니다.

그러나 Linux에서 대부분의 경로는 ~(물결표)로 시작 하므로 만족스러운 결과를 얻지 못합니다.

사용할 수 있습니다 srblib.

>>> import os
>>> os.path.abspath('~/hello/world')
'/home/srb/Desktop/~/hello/world'
>>> from srblib import abs_path
>>> abs_path('~/hello/world')
'/home/srb/hello/world'

사용하여 설치 python3 -m pip install srblib

https://pypi.org/project/srblib/


1

나는 글로브를 선호합니다

현재 폴더의 모든 파일 형식을 나열하는 방법은 다음과 같습니다.

import glob
for x in glob.glob():
    print(x)

현재 폴더에있는 모든 .txt 파일을 나열하는 방법은 다음과 같습니다.

import glob
for x in glob.glob('*.txt'):
    print(x)

선택한 디렉토리에 모든 파일 유형을 나열하는 방법은 다음과 같습니다.

import glob
for x in glob.glob('C:/example/hi/hello/'):
    print(x)

이것이 당신에게 도움이 되었기를 바랍니다


2
다른 질문에 대답하고있는 것 같습니다. "경로를 어떻게 얻습니까?"가 아니라 "절대 경로"였습니다. 첫 두 경우에 os.path.abspath()상대 경로가 glob제공 하는 모든 것에 정답 ( )을 적용 할 수 있습니다 .
NichtJens

1

당신이 맥에 있다면

import os
upload_folder = os.path.abspath("static/img/users")

이것은 당신에게 전체 경로를 줄 것입니다 :

print(upload_folder)

다음 경로를 보여줍니다.

>>>/Users/myUsername/PycharmProjects/OBS/static/img/user

1

누군가 파이썬과 리눅스를 사용하고 파일의 전체 경로를 찾고있는 경우 :

>>> path=os.popen("readlink -f file").read()
>>> print path
abs/path/to/file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.