파이썬을 이용한 파일 자동화 - (1) os 라이브러리
본문 바로가기
PYTHON/기본 문법

파이썬을 이용한 파일 자동화 - (1) os 라이브러리

by 공돌이삼촌 2023. 5. 31.
반응형

 

먼저 파일 경로에 대해서 이해를 해보자

경로는 두가지가 있다. => 절대 경로/ 상대 경로

절대 경로 : 절대적인 경로로 표현 (ex.C:\Users\A\예산안_최종.xlxs)

상대 경로 : 상대적인 위치를 표현하기 때문에 시작점이 중요함.(ex. .\예산안_최종.xlxs  A폴더 위치에서)

 

 

필요한 라이브러리를 확인해보자

가장 기본적인 os library가 있다.

import os를 통해 활성화 해보자

import os

현재 절대 경로를 확인하기 위해 pwd를 사용해보자

보통 리눅스 kernel에서 pwd를 그냥 사용하면 절대경로가 보이지만

python cshell에서는 앞에 !를 붙여주자

!pwd

이처럼 한글이 깨지는 이슈는 os 라이브러리로 해결 가능하다.

cwd의 의미는 current working directory로 os 라이브러리를 통해서 불러오기 때문에 한글 같은 글자에서

유니코드가 깨지지 않는다

os.getcwd()

 

 

 

그럼 만약에 폴더를 이동하고 싶다.

그러면 os.chdir 

chdir는 change directory로 이러한 약자를 알고 있다면 

좀 더 기억하기 쉽다.

 

os.chdir('../')
print(os.getcwd())

이는 경로를 절대경로도로 가능하다.

다만 절대경로로 설정시에 \ 기호에 주의하자

\를 인식하기 위해서 역슬래시를 한번 더 \\ 표현해주어야 해결 가능하다.

os.chdir("C:\\Users\\user\\Documents\\")
print(os.getcwd())

 

폴더를 만들때는 os.mkdir

make directory라는 뜻이다.

이미 기존에 같은 이름의 directory가 있다면

error가 난다.

A라는 폴더가 있다면 A/B를 통해 A의 하위 폴더인 B를 만들수도 있다

이 때 A가 존재하지 않으면 에러가 발생한다.

 

만약 A폴더가 없지만 A도 만들고 하위로 B를 만들고 싶다면

os.makedirs를 사용하면 된다.

os.makedirs('A/B')

 

특정 경로에 파일, 폴더가 존재하는지 확인해주는 기능도 있다.

있으면 True, 없으면 False를 반환한다.

os.path.exists()

os.path.exists('A/B')

 

따라서 이러한 cmd를 이용하여 해당 폴더가 없을 경우 makedirs를 통해서 만들 수 있는

if문을 구성할 수 있다.

download_folder = "test"
if not os.path.exists(download_folder):
    os.makedirs(download_folder)
else:
    print("already exists")

 

파일을 삭제하는 기능은 os.remove를 사용하면 된다.

download_file = "target.png"
if os.path.exists(download_folder):
    os.remove(download_file)
    print("삭제되었습니다.")

 

빈 폴더를 삭제하기 위해서는 os.rmdir()를 사용하면 된다.

 

경로를 join할 수 도 있다.

기본 경로를 변수로 놓고 새 파일이름과 절대 경로로 이어서 붙여서 작업을 할 경우

os.path.join를 사용하면 된다.

그냥 join함수의 경우 별도로 \를 붙여줘야하지만

os.path.join은 문자들 사이에 \를 자동으로 붙여준다.

dir="C:\\Users\\user\\Documents"
temp_path = os.path.join(dir,'4.png')
print(temp_path)

 

거꾸로 전체 절대 경로에서 마지막 파일 이름만 추출하고 싶을때는

os.basename()을 사용하면 된다.

path = "C:\\Users\\user\\Documents\\카카오톡 받은 파일\\4.png"
basename=os.path.basename(path)
print(f"Base name : {basename}")

 

파일을 제외한 폴더를 추출하는 경우는 os.path.dirname()으로 처리하면 된다.

path = "C:\\Users\\user\\Documents\\카카오톡 받은 파일\\4.png"
dirname=os.path.dirname(path)
print(dirname)

 

파일이나 폴더의 이름을 바꾸거나 옮기는 것도 가능하다.

경로가 올바르지 않다면 에러가 발생하며, 해당 위치에 파일이름이 이미 존재하는 경우에도 에러 발생한다.

os.rename(옮기고 싶은 것,해당 위치에 원하는 이름)

폴더라면 폴더 하위에 있는 파일도 함께 이동한다.

os.rename('4.png','data/4.png')

 

 

한 폴더 내에 파일 및 폴더 리스트를 불러오는 함수도 있다.

 

 

 

그럼 파일을 확장자별로 구분하여 폴더를 만들고 이동시키는 code를 구현해보자

import os
cur_dir = os.getcwd()
# 파일 리스트 받기
dir_list = os.listdir(os.path.join(cur_dir,'./practice'))
# 확장자 리스트 받기
postfix=['jpg','xlsx','PNG']
# for문으로 파일을 확장자별로 폴더를 만들고 분류하기
for i in dir_list:
    for j in postfix : 
        dir = os.path.join(cur_dir,'practice',j)
        if not os.path.exists(dir):
            os.makedirs(dir) 
        if j in i:
            if not os.path.exists(os.path.join(dir,i)):
                os.rename(os.path.join(cur_dir,'practice',i),os.path.join(dir,i))
                print(f"{i} 파일이 {j} 폴더로 이동합니다.")
반응형

댓글