본문 바로가기
코딩/자동화

파이썬으로 파일 자동 분류하는 방법(PC, 스마트폰 모두 가능)

by 나홀로코더 2021. 11. 23.
반응형

이 글에서는 파이썬을 이용해 대량의 파일을 일정한 기준에 따라 폴더별로 분류하는 방법을 소개한다.

외장하드에 아무렇게나 백업해둔 사진 파일들, 안드로이드 스마트폰 사용자라면 수없이 쌓여 있을 통화 자동 녹음 파일들, 다운로드 폴더에 정신없이 쌓여 있는 다양한 유형의 파일 등을 몇초 안에 정리할 수 있다.

분류의 기준은 파일명의 일부나 파일의 확장자, 파일의 생성이나 수정 시점 등으로 다양하게 적용할 수 있다.

또한 이 블로그에 소개했던 파이드로이드 앱을 이용하면 PC에서뿐만 아니라 폰에서도 직접 실행할 수 있다.

우선은 확장자별로 분류하는 버전을 먼저 소개한 뒤에, 좀 더 다양한 기준으로 분류할 수 있도록 만들어 실제로 사용 중인 스크립트를 소개하겠다.


1. 확장자로 분류하는 간단한 스크립트


우선 필요한 라이브러리를 임포트한다.

※ os는 폴더 내의 파일 목록을 불러오거나 폴더를 생성하기 위한 것이고, shutil은 파일들을 옮기기 위한 것이다.

import os from shutil import move


os 라이브러리의 listdir 함수를 이용해 폴더 내의 모든 파일을 리스트로 만들어 files 변수로 지정해준다.

files = os.listdir()



다음으로, 모든 파일들에서 확장자를 추출해 category 변수로 지정해준 다음 각 확장자별로 폴더를 만들어준다.

※ 중복값을 제거하기 위해 set 함수를 사용하였다. 리스트컴프리헨션을 이용해 files 리스트에서 확장자만 추출하여 리스트를 만들고, 그 리스트를 set 함수에 넘겨주었다. file[file.rfind('.'):] 부분은, 'files 내의 각 아이템(file)에 대해서 마침표(.)가 오른쪽에서부터 몇번 째에 있는지를 찾고, 그 위치부터 끝까지의 텍스트를 뽑아내라'는 뜻이다.
upper 함수를 사용한 이유는, 가끔씩 같은 파일 유형인데 확장자의 대소문자만 달라 다른 폴더로 분류되는 경우가 있기 때문이다.

category = set([file[file.rfind('.'):].upper() for file in files]) 
for c in category: 
	os.makedirs(c)


마지막으로, move 함수를 이용해 파일들을 이동해준다.

※ shutil의 move 함수에는 2개의 인자를 넘겨주는데, 앞의 것은 옮길 파일명이고, 뒤의 것은 옮길 위치이다.

for file in files: 
	move(file, file[file.rfind('.'):])


코드가 매우 간단하다.

이제 위에서 설명한 코드들을 하나의 파이썬 스크립트로 작성한 뒤에, 파일을 정리하고자 하는 폴더에서 실행하면 된다.

실행 방법은 여러 가지가 있는데, 필자는 해당 폴더에서 터미널을 열어서 실행하는 방법을 선호한다.

해당 폴더를 열고, 아래와 같이 주소(?) 입력 란에 cmd를 입력하면 해당 폴더를 작업폴더(current directory)로 하는 터미널 창이 열린다.

터미널 창에 python [파이썬 스크립트 파일 경로]를 입력한다.

스크립트가 현재 디렉토리에 있지 않으므로 파일 경로는 C:부터 시작하는 전체 경로를 입력해줘야 한다.

예) python C:\Users\user\Desktop\파일분류.py


스마트폰에서 이 스크립트를 실행하려면 어떻게 하면 될까?

일단 필자가 블로그에 올렸던 파이드로이드 사용법을 확인한다.

그리고 파이드로이드에서 위 스크립트를 만들거나, PC에서 만든 스크립트를 스마트폰으로 옮긴다.

그리고 작업하려는 폴더에 스크립트를 복사한 다음 파이드로이드를 실행하고, 작업하려는 폴더에 있는 스크립트를 열어서 실행하면, PC에서 하는 것과 똑같이 파일이 분류될 것이다.

2. 좀더 다양한 옵션으로 분류할 수 있는 스크립트(필자가 실제로 사용하는 버전)

필자가 실제로 사용 중인 스크립트를 공유한다.

이 스크립트를 실행하면 먼저 pyautogui의 텍스트 입력 프롬프트가 뜨는데, ext(확장자별), cat(파일명의 일부를 추출해 만든 카테고리별), time(연도별) 중에 선택해 입력하도록 하였다.

※ 스마트폰에서는 pyautogui가 제대로 작동하지 않으므로 이 버전을 스마트폰에서 실행하려면 pyautogui 부분을 지우고, 스크립트에다 MODE를 직접 입력해줘야 한다.


cat의 경우에는 실행하기 전에 스크립트를 본인의 필요에 따라 조금 수정해야 한다.

현재는 파일명의 앞 2글자를 따서 파일을 분류하게 돼 있고, 주석 처리된 코드의 윗줄을 지우고, 주석처리된 것을 살리면 파일명에서 언더바(_) 표시를 찾아서 그 앞자리까지를 분류 기준으로 삼는다.

본인이 분류하려는 기준에 맞게 적절히 수정하면 될 것이다.

def get_files(mode='ext'):
    global files
    if mode == 'cat' or mode == 'ext':
        files = os.listdir()
    elif mode == 'time':
        import time
        dir = os.scandir()
        files = [(i.name, time.ctime(i.stat().st_mtime).split()[4]) for i in dir]

def make_folders(mode='ext'):
    if mode == 'cat':
        category = set([file[:2] for file in files])
        # category = set([file[:file.find('_')] for file in files])
    elif mode == 'ext':
        category = set([file[file.rfind('.'):].upper() for file in files])
    elif mode == 'time':
        category = set([file[1] for file in files])
    for c in category:
        os.makedirs(c)

def move_files(mode='ext'):
    if mode == 'cat':
        for file in files:
            move(file, file[:2])
            # move(file, file[:file.find('_')])
    elif mode == 'ext':
        for file in files:
            move(file, file[file.rfind('.'):])
    elif mode == 'time':
        for file in files:
            move(file[0], file[1])

import os
from shutil import move
import pyautogui
MODE = pyautogui.prompt(title='Mode 선택',text='ext/time/cat 중 택1')
get_files(mode=MODE)
make_folders(mode=MODE)
move_files(mode=MODE)
반응형

댓글