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"))
# Trueprint(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"))
# Trueprint(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"))
# Falseprint(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
- file은 해당 파일이 모듈로서 로드되면 __file__이라는 이름으로 설정됩니다.
- file을 절대 경로화 해줍니다. (맨 앞 /가 붙는 것 빼고는 차이점이 없습니다.)
- 절대 경로에서 디렉터리 경로를 가져옵니다.
- BASE_DIR이라는 변수에 저장에 사용합니다.
출처: https://itmining.tistory.com/122 [에반, 어른반:티스토리]
'Language > Python' 카테고리의 다른 글
Python 객체의 모든 속성의 키를 가져오는 방법 - dir (0) | 2024.03.19 |
---|---|
파이썬에서 2중 리스트를 flatten하게 만들기 (0) | 2024.03.13 |
[파이썬] 파일 압축 후 google drive api를 이용해 google drive에 업로드하기 (0) | 2020.12.08 |
[라즈베리파이] 라즈베리파이와 윈도우 PC 소켓 통신 하기 (0) | 2020.11.23 |