Os path join 오류 - Os path join olyu

방법 1 : 절대 경로 입력 방식

# 방법 1 : 절대 경로 입력 방식
import pygame

image = pygame.image.load("/Users/my_Mac/Desktop/Python Folder/pygame/images/image.jpeg")

단점 : 폴더 구조나 폴더 혹은 파일이 이동할시 오류가 발생할 가능성이 있다. 

예1) 같은 코드를 다른 사람과 각각의 컴퓨터에서 같이 작업할 경우 경로가 다르기 때문에 오류가 날것이다

예2) 배포시 EC2컴퓨터의 경로가 다르기 때문에 오류가 날것이다

예3) 이미지 파일들을 병합하여 이미지 파일의 위치가 변경될 경우 모든 이미지들의 경로를 다시 복사해와 붙여넣기 해줘야한다.


방법 2 : os를 이용한 폴더 정의후 검색 방식

import pygame
import os

# 현재 위치 정의
current_path = os.path.dirname(__file__)

# 이미지 폴더 위치 정의
image_path = os.path.join(current_path, "images")

# 불러올 이미지 로드
image = pygame.image.load(os.path.join(image_path, "image.jpeg"))

장점 : 폴더 위치와 불로올 이미지 파일 이름만 정확히 입력해 준다면,

폴더 위치가 바뀌거나 작업하는 컴퓨터가 달라져도 에러 없이 코드 실행이 가능하다.

위 예시에 대한 폴더 구조 설명

pygame
├── pygame.py
└── images
   └── image.jpeg

파일을 읽고 쓰려면 우선 원하는 경로를 지정할 수 있어야 하는데, 윈도우, Mac os, 리눅스 등 각 운영체제에서는

경로를 지정할 때 구분하는 기호를 쓰는데

윈도우에선 백슬래시(\)를 사용하지만, Mac os에서는 슬래시(/)를 사용합니다.

따라서 경로를 지정하려면 운영체제에 따라 다르게 처리해주어야 합니다.

이럴 때에 유용하게 쓸 수 있는 함수가 있는데요. 물론 일반적인 상황에서도 자신이 저장하고 있는, 실행하고 있는 디렉

토리를 알려고 할떄 사용하는 명령어인데, 이것이 바로  os.path.join() 함수입니다.

함수 안에 경로의 개별 폴더 이름을 지정하면 해당 경로를 각 운영체제에 맞는 구분 기호를 사용하여 생성해줍니다.

import os
print(os.path.join('user','Desktop','Python'))
Os path join 오류 - Os path join olyu
맥북에서 실행하면 / 표시가 뜨는데요...
Os path join 오류 - Os path join olyu
전체 경로가 뜨지는 않습니다

현재 디렉토리 경로 - os.getcwd()

현재 작업하고 있는 디렉토리의 경로는 os.getcwd() 함수로 얻을 수 있습니다.

import os
print(os.getcwd())
Os path join 오류 - Os path join olyu
이것은 윈도우에서 현재 위치를 알기 위해서 실행하면 이렇게 뜬다 -윈도우 백슬래시(\)
Os path join 오류 - Os path join olyu
맥에서 실시했을떄

작업중인 디렉토리 변경 - os.chdir()

만약 작업 중인 디렉토리를 변경하고 싶다면 os.chdir() 함수로 바꿀 수도 있습니다.

import os
print(os.getcwd())
os.chdir('/' + os.path.join('Users','VScode','Pythn_Practice'))
print(os.getcwd())

위 코드를 실행한 결과는 아래와 같습니다.

이것은 실제 해당 디렉토리에 해당 폴더를 만들어 놓지 않아서, 생기는 작은 오류입니다.

[WinError 3] 지정된 경로를 찾을 수 없습니다: '/Users\\VScode\\Pythn_Practice'

해당 디렉토리에 파일을 만들어놓은 후에 실시해서 os 라이브러리를 임포트해야만, 이렇게 필요한 경로 변경이 이뤄집니다.

Os path join 오류 - Os path join olyu
맥에서 실시한 경우

방금 경로를 설정하기 위해 사용했던 os.path.join()함수를 사용하여 경로를 지정하고,

os.chdir()함수를 사용하여 지정한 경로로 작업 디렉토리를 변경했습니다.

만약 존재하지 않는 디렉토리로 변경을 하게 되면 오류가 발생합니다.

Os path join 오류 - Os path join olyu
파일이 존재하지 않으니 당연히 생길수가 없습니다.

 특정 디렉토리에 폴더 만들기 - os.makedirs()

존재하지 않는 디렉토리로 작업 디렉토리를 변경하면 오류가 발생합니다.!! (위에 참고)

그런데 난 꼭 그 이름을 가진 디렉토리로 변경을 해줘야겠다! 라고 하면 그럴 땐 폴더를 만들면 됩니다.

이럴때 사용하는 함수가 os.makedirs()입니다.

import os
print(os.makedirs(os.getcwd()+'/Py'))

위 코드를 실행한 결과는 아래와 같습니다.

Os path join 오류 - Os path join olyu
os.makedirs() 함수-생성한 경로를 반환해주진 않습니다

로컬 환경에서 예제 csv 파일을 다룰 때는 본인이 위치해있는 폴더에 csv 파일을 같이 놔두고 분석을 수행하기에 경로 설정 문제를 겪을 일이 거의 없다. 하지만 협업을 진행할 때에는 사람마다 파일의 위치가 다르기에 모든 환경에서 돌아가도록 절대 경로, 상대 경로 등 경로를 제대로 지정해주어야 한다. 이번 글에서는 python 패키지 중 os, sys로 경로를 설정하는 방법에 대해서 다루어볼 것이다. 

os

os는 경로를 조작할 때 많이 사용하는 모듈이다. os 모듈 중에서 가장 많이 사용되는 함수에 대해서 다루어보자. 

os.environ : 환경 확인

os.environ은 환경 변수들을 확인할 수 있는 함수이다. 환경 변수에는 JAVE_HOME, HADOOP_HOME, HOMEPATH, PYTHONPATH 등 여러 환경 변수들이 존재하는데, 이를 확인할 수 있다. 

import os 

os.environ['PATH']
os.environ['PYTHONPATH']
os.environ['USERNAME']
os.environ['JAVA_HOME']
os.environ['HADOOP_HOME']
os.environ['HOMEPATH']

os.chdir : 경로 변경

os.chdir는 경로를 변경해주는 함수이다. PATH를 지정해두면 해당 PATH로 경로 변경이 가능하다. 

PATH = '경로'
os.chdir(PATH)

os.getcwd : 현재 경로 확인

os.getcwd는 현재 경로가 어디에 위치되어 있는지 확인 할 수 있는 코드로써, 유용하게 사용된다. 

os.getcwd()
PATH = os.getcwd() + '\file'
os.chdir(PATH)
os.getcwd()

현재 경로에서 file이라는 폴더로 경로를 변경하고 싶을 때 \file을 추가해줌으로써 경로를 변경하고 경로가 바뀐 것을 확인할 수 있을 것이다. 

os.listdir : 폴더명 반환

PATH를 입력했을 경우 해당 directory에 있는 항목들의 이름을 반환해준다. 리스트 내 항목을든 임의의 순서로 나열되며, '.', '..' 로 시작하는 파일명은 호출되지 않기에 주의하자.

os.listdir(path = '.')

os.listdir(path = '..') # abspath

PATH = r'C:/Users'
os.listdir(PATH)

os.listdir의 기본값은 path='.'이며 현재 경로에서의 파일이름을 반환해준다. path='..'로 설정할 경우 절대 경로에서 접근하며 PATH를 따로 지정해줄 수도 있다. python 3.2 아래의 version을 사용하는 경우 path를 필수적으로 작성해주어야 되지만, 3.2 이후 버전부터는 선택사항이라 고려하지 않아도 된다. 

os.mkdir, os.makedirs : 폴더 생성

os.mkdir는 많이 사용하는 함수 중 하나이다. 이름에서도 느껴지듯 directory에 folder를 만들어주는 함수이다. os.makedirs도 folder를 생성해주는 함수이지만 exist_ok라는 인자가 존재해 True로 지정할 경우 해당 directory에 folder가 존재하더라도 에러코드를 발생시키지 않지만, False로 지정할 경우 FileExistsError를 반환한다. 추가적으로 os.mkdir의 경우 가장 마지막에 위치해 있는 folder만 생성해주는  반면에, os.makedirs를 사용하게 되면 해당 경로의 모든 폴더를 만들어줌으로 조금 더 유용하다. 

PATH = os.getcwd() 
file_name = r'\a'
os.mkdir(path = PATH + file_name)


PATH = os.getcwd() 
file_name = r'\a'
os.makedirs(name = PATH + file_name, exist_ok = False)

os.remove: 파일 삭제

PATH에 존재하는 파일을 지우는 함수이며, 사용 중인 파일을 제거하려고 시도할 경우 유닉스에서는 삭제가 되지만, 윈도우에서는 삭제가 되지 않는다. 만약 해당 파일이 존재하지 않을 경우 FileNotFoundError를 반환한다. 

# os.remove
PATH = os.getcwd()
file_name = r'\a'
os.remove(PATH + file_name)

os.path

os.path는 폴더명이나 파일명을 확인하고 존재유무를 파악할 수 있도록 도와주는 모듈이다. 

os.path.abspath : 절대 경로 반환

폴더 혹은 파일이 존재하는 위치에서의 절대 경로를 반환한다. 

PATH = os.getcwd()
os.path.abspath(PATH)

os.path.basename

PATH의 기본 이름을 반환합니다. 예를 들어 PATH=r'c:\Users\Desktop\test.csv' 라고 한다면 이 PATH의 기본 이름은 test.csv가 된다. PATH를 split('\')해서 마지막 요소를 반환해주는 것과 동일하다. 

PATH
PATH.split('\\')[-1] == os.path.basename(PATH) # True

os.path.dirname

PATH의 directory 명을 반환한다.  예를 들어 PATH=r'c:\Users\Desktop\test\os' 라고 한다면 os.path.dirname의 반환값은 test가 된다. 

# os.path.dirname
os.path.dirname(PATH)

os.path.split

dirname의 경우 입력 경로의 폴더 경로까지 반환하지만, basename의 경우 파일이름만 출력한다는 차이가 존재한다. dirname과 basename을 한 번에 확인하고 싶을 때는 os.path.split 모듈을 사용하면 tuple형태로 반환한다.

# os.path.dirname
os.path.dirname(PATH)

DIRNAME, BASENAME = os.path.split(PATH)
DIRNAME == os.path.dirname(PATH) # True
BASENAME == os.path.basename(PATH) # True

os.path.exists

PATH가 존재하면 True를 반환하고, 존재하지 않을 경우 False를 반환한다. 

# os.path.exists 
os.path.exists(PATH) # True
os.path.exists(PATH + r'\a') # False

os.path.isfile, os.path.isdir

isfile은 PATH가 존재하는 파일명일 경우 True를 반환하고, isdir의 경우 존재하는 directory일 경우 True를 반환한다. 

# os.path.isfile 
PATH = os.getcwd()
os.path.isfile(PATH) # False

# os.path.isdir
os.path.isdir(PATH) # True

예제에서는 PATH를 directory 명으로 설정해두었기에 isfile의 경우 False를 반환하고, isdir의 경우 True를 반환하는 것을 확인할 수 있다. 

os.path.join

경로와 파일명을 결합하고 싶을 때 사용하는 모듈이다. 해당 파일이 위치한 절대경로를 불러와 파일명을 결합할 수도 있다. BASE_PATH를 설정해주거나 할 때 사용된다. 

# os.path.join 
PATH = os.getcwd()
DIRNAME, BASENAME = os.path.split(PATH)
PATH == os.path.join(DIRNAME, BASENAME) # True