어쩌다 딥러닝 연구원

Python OS 모듈 : 실무 코드로 알아보는 활용 예 본문

개발

Python OS 모듈 : 실무 코드로 알아보는 활용 예

한샹곰 2020. 3. 7. 12:44

os 모듈을 잘 모르는 분들께 도움이 될 코드들이다. 남들이 이미 다 써놓은 os 모듈 글을 왜 쓰냐는 질문이 들어올 것 같은 자의식과잉 환자로써 말하자면, 개발일지 겸사겸사 쓰는 글이라고 봐 주시면 감사하겠다.

 

최근 신경망에 학습시킬 데이터를 분류하는 작업을 주로 해왔기 때문에 이 글을 쓰게 되었다.

os모듈의 함수들을 잘 활용하면 파일들을 일괄적으로 다루는 데 도움이 많이 된다.

os.listdir(directory_path) 함수는 디렉토리 내의 파일명, 폴더명을 모두 얻어온다.

 

예를 들어 directory path가 절대 경로가 /home/A 라는 폴더의 위치이고 A라는 폴더 안에 x라는 폴더가 있고 y.jpg라는 파일이 있다면

얻어지는 리스트는 ['x','y.jpg']인 것이다.

 

os.listdir 함수를 사용하였을 때 파일이든 폴더든 경로 전체가 아닌 이름만 반환되는 것이 문제이기 때문에 절대경로를 완성시키기 위해서는 두 가지 방법을 사용한다.

1.os.path.join 함수 사용

 

함수 사용은 간단하다.

/home/라는 디렉토리가 있고

 

그 아래 a 라는 폴더가 있으면

os.path.join('/home/','a') 의 값은

'/home/a' 가 된다.

 

물론 , 또 그아래 b 라는 폴더가 있으면 

os.path.join('/home/','a','b') 처럼 사용하면 된다. 아무튼, 코드를 보고 이해해 보자.

필자가 업무에 직접 활용한 코드이다.


import os
target_dir='대충 폴더 디렉토리'

"""
필자의 경우 데이터 디렉터리 구조가 날짜별, id별로 되어있음을 미리 밝힌다. 
"""

for date in os.listdir(target_dir):
    datepath=os.path.join(target_dir,date)
    for each_id in os.listdir(datepath):
        date_id_path=os.path.join(datepath,each_id)
        
        for filename in os.listdir(date_id_path):
            filepath=os.path.join(date_id_path)
            if os.path.isfile(filepath):
                rotate(filepath)
        
    

for문을 이용해 디렉터리를 하나하나 파헤치면 된다.

중간에 파일이 껴있는 경우는 어떻게 하는가에 대해서는 아래의 방법에 포함되어있다.

 

2.list comprehension 사용

아까의 예를 다시 가져오자면, target_dir의 값은 '/home/hanshangom/a/' 가 되는 것이고

datefolders의 값은 ['/home/hanshangom/a/x', '/home/hanshangom/a/y.jpg'] 가 되는 것이다.

폴더만 연달아 참조하고 싶을 때 comprehension을 사용할 줄 안다면  다음과 같은 코드를 참고하여 이해하면 좋다.

 

추가로, os.path.isfile/os.path.isdir 함수는 각각 파일인지/디렉토리인지 경로를 보고 판단하는 함수이다.

import os
import os
target_dir=os.getcwd()+'/' #현재 작성중인 코드 파일의 위치

#파일 디렉토리 상관없이 경로 얻어오기
datefolders=[target_dir+folder_name for folder_name in os.listdir(target_dir)]

#디렉토리 경로만 얻어오기
datefolders=[target_dir+folder_name for folder_name in os.listdir(target_dir) if not os.path.isfile(target_dir+folder_name) ]
datefolders=[target_dir+folder_name for folder_name in os.listdir(target_dir) if os.path.isdir(target_dir+folder_name) ]

#파일 경로만 얻어오기
files=[target_dir+folder_name for file_name in os.listdir(target_dir) if os.path.isfile(target_dir+file_name) ]
files=[target_dir+folder_name for file_name in os.listdir(target_dir) if not os.path.isdir(target_dir+file_name) ]

 조금 naive 한 방법으로는 이런 식의 코드가 있다. 이건 필자가 왜 썼는지 기억이 나지 않으니 넘어가자.

abnormal=[]
folders=[os.getcwd()+'/data/skin_0305_0306/']
for folder in folders:
    for each_id in os.listdir(folder):
        if len(each_id)>4 and each_id[-4]=='.':
            continue
        for filename in os.listdir(folder+'/'+each_id):
            path=folder+'/'+each_id+'/'+filename
            rotate(path)

글이 유용했다면, 하트를 눌러주면 감사하겠다.

 

반쯤 반말체라 기분이 나쁘셨다면 죄송합니다. 아무튼 하트를 눌러주시면 감사하겠습니다! 

그럼 제가 기분이 조크등요

Comments