본문 바로가기

Basic 마이닝/Python

[Python] 파이썬 파일과 디렉토리 경로

서론

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

조만간 포스팅 할 예정인 파이썬을 이용한 웹 크롤링, 스크래핑 주제를 공부하던 중 막히는 부분이 생겼습니다. 바로 위의 구문입니다. 이를 이해하기 위한 지식을 공부하며 포스트를 작성합니다.


시작

파이썬은 파일 경로 또는 디렉토리와 관련한 코드가 많이 필요합니다. 파일 및 디렉토리 경로에 관한 함수는 모두 os 모듈을 사용하기 때문에 os 모듈의 import가 필요합니다. 직접 쳐보면서 따라하길 권장합니다. (하단 코드에선 import os를 생략합니다.)




현재 작업 폴더 얻기

os.getcwd()를 사용하여 얻습니다. (get current working directory)

print(os.getcwd())
# /Users/evan/dev/python/web-crawler-py/parsed_data



디렉토리 변경

os.chdir(path)를 사용합니다. (path는 문자열이어야함.)

os.chdir("/Users")
print(os.getcwd())
# /Users



특정 경로에 대해 절대 경로 얻기

os.path.abspath(path)

print(os.path.abspath("web-crawler-py/parsed_data"))
# /Users/evan/dev/python/web-crawler-py/parsed_data/web-crawler-py/parsed_data



경로 중 디렉토리명만 얻기

os.path.dir(path)

print(os.path.dirname("/Users/evan/dev/python/web-crawler-py/parsed_data"))
# Users/evan/dev/python/web-crawler-py



경로 중 파일명만 얻기

os.path.basename(path)

print(os.path.basename("/Users/evan/dev/python/web-crawler-py/parsed_data"))
# parsed_data



경로 중 디렉토리명과 파일명 나누어 얻기

os.path.split(path) 디렉토리명, 파일명이 리스트 형태로 나옵니다.

dir, file = os.path.split("/Users/evan/dev/python/web-crawler-py/parsed_data")
print(dir, file, sep="\n")
# /Users/evan/dev/python/web-crawler-py
# parsed_data



파일 경로를 리스트로 얻기

파일 경로를 os.path.sep(OS별 파일 경로 나는 문자)를 이용해 split합니다.

print("/Users/evan/dev/python/web-crawler-py/parsed_data".split(os.path.sep))
# ['', 'Users', 'evan', 'dev', 'python', 'web-crawler-py', 'parsed_data']



경로를 병합하여 새 경로 생성

os.path.join(path, path1, path2, ...) 넘겨준 path들을 묶어 하나의 경로로 만들어줍니다.

print(os.path.join("/Users/evan/dev/python/web-crawler-py/parsed_data", "test"))
# /Users/evan/dev/python/web-crawler-py/parsed_data/test



디렉토리 안의 파일/서브 디렉토리 리스트

os.listdir(path) path 하위에 있는 파일, 디렉토리 리스트를 보여줍니다.

print(os.listdir("/Users/evan/dev/python/web-crawler-py/parsed_data"))
# ['migrations', 'models.py', '__init__.py', '__pycache__', 'apps.py', 'parser.py', 'admin.py', 'tests.py', 'views.py']



파일 혹은 디렉토리가 존재하는지 체크

os.path.exists(path)

print(os.path.exists("/Users/evan/dev/python/web-crawler-py/parsed_data"))
# True

print(os.path.exists("/Users/evan/dev/python/web-crawler-py/parsed_data/admin.py"))
# True



디렉토리가 존재하는지 체크

os.path.isdir(path)

print(os.path.isdir("/Users/evan/dev/python/web-crawler-py/parsed_data"))
# True

print(os.path.isdir("/Users/evan/dev/python/web-crawler-py/parsed_data/admin.py"))
# False



파일이 존재하는지 체크

os.path.isfile(path)

print(os.path.isfile("/Users/evan/dev/python/web-crawler-py/parsed_data"))
# False

print(os.path.isfile("/Users/evan/dev/python/web-crawler-py/parsed_data/admin.py"))
# True



파일의 크기

os.path.getsize(path)

print(os.path.getsize("/Users/evan/dev/python/web-crawler-py/parsed_data"))
# 352



정리

용도함수 예제
현재 작업 폴더 얻기os.getcwd() # "C:\Temp"
디렉토리 변경os.chdir("C:\Tmp")
특정 경로에 대해 절대 경로 얻기

os.path.abspath(".\Scripts") #"C:\Python35\Scripts"

경로 중 디렉토리명만 얻기

os.path.dirname("C:/Python35/Scripts/pip.exe") # "C:/Python35/Scripts"

경로 중 파일명만 얻기os.path.basename("C:/Python35/Scripts/pip.exe") # "pip.exe"
경로 중 디렉토리명과 파일명을 나누어 얻기dir, file = os.path.split("C:/Python35/Scripts/pip.exe")
파일 각 경로를 나눠 리스트로 리턴하기 os.path.sep은 OS별 경로 분리자"C:\Python35\Scripts\pip.exe".split(os.path.sep) # ['C:', 'Python35', 'Scripts', 'pip.exe']
경로를 병합하여 새 경로 생성os.path.join('C:\Tmp', 'a', 'b') # "C:\Tmp\a\b"
디렉토리 안의 파일/서브디렉토리 리스트os.listdir("C:\Python35")
파일 혹은 디렉토리 경로가 존재하는지 체크하기os.path.exists("C:\Python35")
디렉토리 경로가 존재하는지 체크하기os.path.isdir("C:\Python35")
파일 경로가 존재하는지 체크하기os.path.isfile("C:\Python35\python.exe")
파일의 크기os.path.getsize("C:\Python35\python.exe")

결론

자 그럼 지금까지 배운것으로 다음 구문이 도대체 뭘 의미하는지 알아보겠습니다.

BASE_DIR = os.path.dirname(os.path.abspath(__file__))


import os

print(__file__)
# /Users/evan/dev/python/web-crawler-py/parsed_data/parser.py

print(os.path.abspath(__file__))
# Users/evan/dev/python/web-crawler-py/parsed_data/parser.py

print(os.path.dirname(os.path.abspath(__file__)))
# /Users/evan/dev/python/web-crawler-py/parsed_data

1. __file__은 해당 파일이 모듈로서 로드되면 __file__이라는 이름으로 설정됩니다.

2. __file__을 절대 경로화 해줍니다. (맨 앞 /가 붙는 것 빼고는 차이점이 없습니다.)

3. 절대 경로에서 디렉터리 경로를 가져옵니다.

4. BASE_DIR이라는 변수에 저장에 사용합니다.