"Life is too short, You need python"
일상생활에서의 Path(경로)란 '어떤 목적지로 향하는 길'이라는 의미로 쓰입니다. File System에서 목적지는 Directory 또는 File이며 이를 찾아가는 길을 Path라고 합니다. 즉, Path(경로)는 File, Directory 등의 위치 정보를 의미합니다. 절대 경로, 상대 경로에 대해 이해하고 현재 작업 Directory를 알아내거나 변경하는 방법을 알아보도록 하겠습니다.
Absolute Path & Relative Path ( 절대 경로 & 상대 경로 )
- Path : 경로, File, Directory 등의 위치 정보
Python에서 경로를 표시하는 방법에는 2가지가 있습니다. 첫 번째는 Absolute Path(절대 경로)와 두 번째는 Relative Path(상대 경로)입니다. 상대와 절대의 기준은 '내 작업 위치'입니다.
굳이 일상생활에서 비유를 한다면 절대 경로는 '집 주소', 상대 경로는 '내 위치에서 길 찾기' 정도일까요?
- Absolute Path : 절대 경로, 내가 작업하는 위치와는 무관하게 변하지 않는 고유 경로
- Relative Path : 상대 경로, 내가 작업하는 위치를 중심으로 표현한 경로
코딩을 하다 보면 잘못된 경로 설정이나 표시 방식의 오류 등과 같은 사소한 실수가 종종 발생합니다. 사소하기 때문에 실수를 발견하기도 쉽지 않을 때도 있습니다. 기초적이지만 중요한 Path(경로)에 대해 잘 익혀 둔다면 실수를 많이 줄일 수 있게 될 것입니다.
Absolute Path ( 절대 경로 )
절대 경로는 기준이 되는 root directory를 반드시 포함하고 있습니다.
해당 파일이 존재하는 폴더에서 탐색기나 Browser의 주소창 클릭 시 선택되는 Block이 바로 절대 경로이며 복사해서 붙여 넣으시면 그것이 바로 절대 경로가 됩니다.
( 절대 경로 예 )
import pandas as pd
df = pd.read_excel(r'D:\PYLIFE\OS\getc(m)time.xlsx')
로딩 속도는 상대 경로에 비해 떨어질 수 있고 경로명이 길다는 단점이 있습니다.
Relative Path ( 상대 경로 )
상대 경로는 현재 작업하는 파일이 있는 폴더가 기준이 됩니다.
- 현재 작업 폴더는 : '.'
- 상위 폴더는 : '..'
- 하위 폴더는 : '/'
로 표기합니다.
( 상대 경로 예 )
현재 작업 중인 Current_Work_Directory 내 cwd_example.xlsx 파일을 불러온다면 파일명만 쓰시면 됩니다.
import pandas as pd
df = pd.read_excel('cwd_example.xlsx')
상위 폴더인 Parent_Directory의 cwd_example_2.xlsx 파일을 불러온다면 다음과 같이 사용합니다.
df = pd.read_excel('../cwd_example_2.xlsx')
하위 폴더인 Sub_Directory의 cwd_example_3.xlsx 파일을 불러온다면 다음과 같이 사용합니다.
df = pd.read_excel('./Sub_Directory/cwd_example3.xlsx')
그렇다면 같은 Same_Location의 Sub_Directory_2 폴더의 cwd_example_4.xlsx 파일은 어떻게 불러올까요?
df = pd.read_excel('./../Same_Location/Sub_Directory/cwd_example_4.xlsx')
df = pd.read_excel('../Same_Location/Sub_Directory/cwd_example_4.xlsx') # 현재폴더 생략 가능
Parent Directory로 우선 이동한 뒤 파일이 있는 폴더까지의 경로를 붙이면 됩니다. (현재 폴더 표기는 생략 가능합니다.)
./ (현재 폴더) + ../ (부모 폴더로 이동) + Same_Location/Sub_Directory/cwd_example_4.xlsx(하위 폴더 경로 추가)
file 혹은 folder의 path가 잘못될 경우
FileNotFoundError: [Errno 2] No such file or directory: 메시지를 출력합니다.
getcwd(), chdir(path)
os.getcwd() : Current Working Directory (현재 작업 디렉터리) 정보를 알 수 있습니다.
os.chdir(path) : Change Directory, 디렉터리를 변경합니다.
( Input )
import os
print(os.getcwd()) # Current Work Directory
os.chdir('..') # Move Parent Directory (Relative Path)
print(os.getcwd()) # Changed Directory
os.getcwd()와 os.chdir() 사용을 위해 os 모듈을 import 합니다.
( Output )
d:\PYLIFE\OS\Parent_Directory\Current_Work_Directory
d:\PYLIFE\OS\Parent_Directory
os.getcwd()로 현재 작업 중인 폴더가 출력이 되는 것을 확인할 수 있고,
os.chdir에 의해 현재 작업 폴더가 상위 폴더로 이동한 것을 볼 수 있습니다.
( Input )
os.chdir('../..')
print(os.getcwd())
( Output )
d:\PYLIFE\OS
상대 경로를 '../..'로 입력 시 상위의 상위 폴더로 이동하였습니다.
( Input )
os.chdir('../Same_Location')
print(os.getcwd())
또는
os.chdir('../Same_Location/Sub_Directory_2')
print(os.getcwd())
( Output )
d:\PYLIFE\OS\Parent_Directory\Same_Location
d:\PYLIFE\OS\Parent_Directory\Same_Location\Sub_Directory_2
같은 폴더 내의 다른 폴더로 이동하기 위해 '../'로 상위로 이동 후 해당 하위 폴더를 지정합니다.
상대 경로를 이용하여 위와 같이 폴더를 이동하시면 됩니다.
( Input )
os.chdir('d:/PYLIFE/OS/Parent_Directory/Same_Location/Sub_Directory_2')
print(os.getcwd())
( Output )
d:\PYLIFE\OS\Parent_Directory\Same_Location\Sub_Directory_2
절대 경로를 통해 이동할 수도 있습니다.
os.path.abspath(), os.path.realpath(), os.path.relpath(), os.path.dirname()
os.path.abspath(path) : 현재 작업 디렉터리 또는 언급한 디렉터리에 있는 file의 절대 경로를 반환합니다.
os.path.realpath(path) : 참조되는 파일의 전체 경로를 제공합니다.(OS의 symbolic link 역참조)
os.path.relpath(path) : 참조되는 파일의 상대 경로를 제공합니다.
os.path.dirname(path) : 매개 변수로 전달된 경로의 디렉터리를 문자열로 반환해 줍니다.
os.path.abspath와 os.path.realpath에 대한 자세한 내용이 궁금하시다면 아래 링크 참고 바랍니다(추후 업데이트 및 Link 예정)
( Input )
print(os.getcwd())
print(os.path.abspath('../../test.xlsx'))
print(os.path.realpath('../../test.xlsx'))
print(os.path.realpath('d:/PYLIFE/OS/test.xlsx'))
# 참고
print(os.path.abspath(__file__))
( Output )
d:\PYLIFE\OS\Parent_Directory\Current_Work_Directory
d:\PYLIFE\OS\test.xlsx
D:\PYLIFE\OS\test.xlsx
..\..\getc(m)time.xlsx
# 참고
d:\PYLIFE\OS\Parent_Directory\Current_Work_Directory\test.py
abspath는 상대 경로의 정보를 받아 절대 경로 값을 출력합니다.
realpath 또한 상대 경로의 정보를 받아 절대 경로 값을 출력합니다.
relpath는 절대 경로를 받아 현재 작업 폴더를 기준으로 상대 경로를 반환합니다.
- 참고로 __file__(전역 변수) 은 현재 열려있는 file의 위치와 이름을 가지고 있는 문자열 변수로 현재 스크립트(. py) 경로를 반환합니다.
os.path.dirname을 사용해 디렉터리 정보만 출력해 보도록 하겠습니다.
( Input )
print(os.path.dirname(os.path.abspath('../../test.xlsx')))
print(os.path.dirname(os.path.realpath('../../test.xlsx')))
print(os.path.dirname(os.path.relpath('d:/PYLIFE/OS/test.xlsx')))
( Output )
d:\PYLIFE\OS
D:\PYLIFE\OS
..\..
마무리
절대 경로와 상대 경로의 개념 그리고 os 모듈의 getcwd(), chdir(path), abspath(), realpath(), relpath()등의 사용법에 대해 알아보았습니다.다른 os module 사용법이 알고 싶으시면 아래 링크 참고 바랍니다(추후 업데이트 및 Link 예정)
'PYTHON > Tips' 카테고리의 다른 글
(5min. Python) 데이터 Type 확인 - type(), isinstance() (0) | 2022.07.04 |
---|---|
(5min. Python) 문자열(String)에서 숫자(Integer)만 추출(extract)하는 방법, , re.sub(), re.findall() (0) | 2022.07.04 |
(5min. Python) Round, Ceil, Floor ( 반올림, 올림, 내림 ) and trunc ( 그리고 버림 ) (0) | 2022.06.29 |
(5min. Python) Slice / Slicing, 슬라이싱의 이해 ( ASCII art diagram ) (0) | 2022.06.28 |
(Python/Exception) Try ~ Except 예외처리 (0) | 2022.06.28 |