본문 바로가기

Study doc./Python

[Python] os, pathlib, pickle 더 이상 모르는척 하지 말자

컴피티션의 상위권 커널을 보면 항상 등장하는 os,pathlib, pickle 모듈!!

경로를 지정해주는 것 같은데, 운영체제니 뭐니 이름부터 거부감들고 어려워보여서 여태 모르는척 했습니다.

 

하지만 딥러닝을 공부하고 있는 요즘,, 더이상 피할수가 없더라구요,, 

그래서 한 번 해보자!! 하고 공부하고 정리해봤습니다. 

 

모듈에 있는 모든 문법을 다뤄보려했으나, 다른 블로거 분들이 너무 설명을 잘해두셔서 저는 가장 많이 쓰이는 문법들에 대해서 간단하게 정리했습니다.

그리고 추후에 여러 커널들을 공부하며 해당 모듈들을 잘 활용한 사례가 있다면 내용을 계속해서 추가하도록 하겠습니다.

 


순서

  1. os
  2. pathlib
  3. pickle

 


 

 

1. os

os(operating system)는 운영체제 라고 합니다. 

(저는 운영체제로 window를 사용하고 있습니다!)

 

그래서 파이썬에서 os를 import 한다는건 파이썬과 내 운영체제를 연결하겠다는 겁니다.

쉽게 말해서 컴퓨터에서 하는 동작들(ex. 빈 폴더 생성, 폴더 열기 등)을 파이썬 내에서 수행하겠다는 의미입니다.

 

다르게 말하면 굳이 파이썬에서 os를 쓰지 않고 직접 컴퓨터로 수행해도 된다는 말입니다.

지금까지 모르는척 해도 아주 큰 문제는 없었던 이유이죠.

 

본론으로 돌아와서, 이제 os 모듈에서 주로 사용하는 세 가지 메서드를 알아보겠습니다.

 

1) os.getcwd()

현재 작업공간의 경로를 반환하는 메서드 입니다.

실제 메서드가 get the path of current working directory 를 뜻합니다.

 

2) os.chdir()

작업공간 경로를 옮기겠다는 메서드 입니다.

changing working directory 로부터 이름지어지게 된 것입니다.

괄호 안에 옮기고자 하는 파일 위치를 넣으면 됩니다.

 

3) os.listdir()

현재 작업공간에 있는 파일을 확인하겠다는 메서드 입니다.

이제 직관적으로 해석이 가능하죠? list directory 입니다.

 

자!! 그럼 이걸 언제, 왜 사용하느냐?

간단한 코드를 실행하는데에는 문제 없지만, 나중에 복잡한 앙상블이나 딥러닝을 하다보면 중간에 모델을 저장해야할 상황이 있습니다.

매번 코드를 처음부터 끝까지 돌리기에 시간이 너무 많이 소요되기 때문이죠!

 

그래서 모델을 중간에 저장하기도 하고, 불러오기도 하는데 이때 파일의 경로를 명확하게 알아야 할 필요성이 생깁니다.

현재 os 모듈을 통해 파일 위치를 파악하고 이동하는 과정을 배웠습니다. 

다음으로는 os 모듈에서 사용할 경로를 수정하는 pathlib 모듈을 보겠습니다.

 

 

2. pathlib

원래 파일 경로를 다룰때 os 모듈만을 활용(os.path.join등을 이용)하기도 합니다.

하지만 pathlib를 사용하면 훨씬 간단하고 이해하기 쉽게 코딩할 수 있습니다.

핵심 아이디어는 path를 문자열이 아닌 객체로 받아들이는 것입니다.

 

사용 예시를 보겠습니다.

현재 작업공간에 있는 특정 폴더(ex. new_workplace)로 이동하려고 할 때, pathlib를 사용해보겠습니다.

import os
from pathlib import Path

current_path = Path(os.getcwd()) # 현재 경로를 객체화
moved_path = current_path / "new_workplace" # new_workplace 경로 만들기

 

 

3. pickle

포스팅 초반에 말씀드렸듯 코드가 길어지고 복잡해지다보면 모델이나 객체들을 파일로 저장해둬야하는 경우가 있다고 했습니다.

하지만 기존 판다스를 이용한 데이터 저장/호출 방법은 텍스트 형태로만 가능했습니다. 리스트나 딕셔너리와 같은 객체들은 저장할 수 없었죠. 

 

하지만 pickle은 파이썬의 모든 객체를 저장/호출 할 수 있습니다.

간단한 예제를 통해 이해해보겠습니다.

import pickle

list_1 = ['Amy','Jone','Tom']
 
# 저장
with open("data.pickle","wb") as f: # wb : 바이트 형식으로 쓰기
    pickle.dump(list_1, f) #(저장하고자 하는 객체, 파일)
 
# 호출
with open("data.pickle","rb") as f: # rb : 바이트 형식으로 읽어오기
    data = pickle.load(f) # (파일)
    
print(data)
#['Amy','Jone','Tom']

 


예제

 - 내 컴퓨터 안에 있는 .py 파일을 모두 찾아라!!

 

import os
from pathlib import Path

def search(dirname):
    try:
        filenames = os.listdir(dirname) # 해당 경로에 있는 모든 파일 출력
        for filename in filenames:
            full_filename = Path(dirname)/filename # os.path.join(dirname, filename) 동일
            if os.path.isdir(full_filename): # 그 파일의 디렉토리가 있으면 True
                search(full_filename)
            else:
                ext = os.path.splitext(full_filename)[-1] # 확장자명과 분리하기
                if ext=='.py':
                    print(full_filename)
    except PermissionError:
        pass

search("C:/")

 

출처 : 점프 투 파이썬, 박응용

 

 

지금까지 파일 경로를 파악하고, 수정하고, 중간 저장하는 방법을 배웠습니다.

앞으로 많은 실력자 분들의 커널을 공부하며, 해당 모듈들의 활용 방법들을 정리해서 추가하겠습니다.