폴더 및 파일 정리 파이썬 함수 만들기

장기간에 걸친 오랜 시간 동안 컴퓨터로 작업을 하면, 폴더가 지저분해 집니다. 폴더 속 폴더와 파일들이 복잡하고 지저분하게 생성되어 있는 경우가 매우 많습니다. 특정 폴더 안에 있는 파일들을 파일 확장자 기준으로 깔끔하게 정리하여 폴더에 저장해 두면 좋겠다는 생각이 들 때가 많이 있습니다. 이번 포스팅에서는 파이썬 프로그램을 활용하여 폴더 및 파일 정리 파이썬 함수 코드를 작성해 보겠습니다. 해당 함수는 파이썬 프로그램이 설치되어 있는 컴퓨터라면 누구나 활용할 수 있습니다.

폴더 안의 파일을 정리하는 파이썬 함수

최종 파이썬 스크립트

아래 함수는 폴더 안의 파일을 정리하는 함수를 나타내는 파이썬 스크립트입니다.

import os
from shutil import move

def sort_files(directoryPath):
    for filename in os.listdir(directoryPath):
        if os.path.isfile(os.path.join(directoryPath, filename)):
            fileExtension = filename.split('.')[-1]
            destinationDirectory = os.path.join(directoryPath, fileExtension)
            if not os.path.exists(destinationDirectory):
                os.makedirs(destinationDirectory)
            move(os.path.join(directoryPath, filename), os.path.join(destinationDirectory, filename))


함수 실행 결과

아래는 “D:\zzinnam\02. 아이콘” 경로에 있는 파일들을 파일확장자명에 해당하는 폴더를 생성하여 정렬하는 파이썬 스크립트입니다.

sort_files(r'D:/zzinnam/02. 아이콘')

위의 코드를 실행하면, 아래와 같이 특정 디렉토리가 깔끔하게 정리된 것을 확인하실 수 있습니다.

함수 코드에 대한 상세 설명

import os

os 모듈에서 제공하는 함수를 사용하기 위해 os 모듈을 로딩하는 코드입니다. os 모듈은 운영체제에서 제공하는 여러 기능을 파이썬에서 수행할 수 있게 해주는 모듈입니다.


from shutil import move

shutil 모듈에서 제공하는 함수 중 move 함수를 사용하기 위해 shutil 모듈 안에 있는 여러 함수 중 move 함수만 로딩하는 코드입니다. shutil 모듈은 파일과 폴더를 이동하거나 복사할 때 사용하는 모듈입니다. 이동할 때는 move함수를 사용하고, 복사할 때는 copy 함수를 사용합니다.


def sort_files(directoryPath):

인수를 1개(directoryPath) 받는 sort_files 함수를 생성합니다.


for filename in os.listdir(directoryPath):

os.listdir(directoryPath)는 directoryPath 경로에 있는 모든 폴더명과 파일명을 리스트로 반환합니다.

# 'D:/zzinnam/02. 아이콘' 경로에 있는 파일명을 리스트로 반환 
directoryPath = r'D:/zzinnam/02. 아이콘'
os.listdir(directoryPath )
--------------------------------------
['accident.png',
 'accident.svg',
 'alcohol.png',
 'alcohol.svg',
 'barchart.png',
 'barchart.svg',
 'chart.png',
 'chart.svg',
 'clock.png',
 'clock.svg',
 'cloud.png',
 'cloud.svg',
 'covid19.png',
 'covid19.svg',
 'Decision.png',
 'Decision.svg',
 'drone.png',
 'drone.svg',
 'firworks.png',
 'firworks.svg',
 'gear.png',
 'gear.svg',
 'in out.png',
 'in-out.svg',
 'mail.png',
 'mail.svg',
 'map.png',
 'map.svg',
 'soccer.png',
 'soccer.svg',
 'star.png',
 'star.svg',
 'thinking.png',
 'thinking.svg',
 'violence.png',
 'violence.svg',
 'WORK-AND-LIFE-BALANCE.png',
 'WORK-AND-LIFE-BALANCE.svg'] 

따라서, for filename in os.listdir(directoryPath): 는
filename에 ‘accident.png’ 값부터 ‘WORK-AND-LIFE-BALANCE.svg’ 값까지 하나씩 입력(대입)하면서 이후 코드를 반복하는 for 명령문을 의미합니다.


if os.path.isfile(os.path.join(directoryPath, filename)):

if 조건문에 os.path.isfile 함수와 os.path.join 함수가 포함되어 있습니다.
os.path.join은 경로와 파일명을 결합할 때 사용하는 함수입니다.

directoryPath = r'D:/zzinnam/02. 아이콘'
filename = 'accident.png'

os.path.join(directoryPath, filename)
----------------------------------------
'D:/zzinnam/02. 아이콘\\accident.png'

os.path.isfile은 경로에 파일의 존재여부(True/False)를 반환하는 함수입니다.

os.path.isfile('D:/zzinnam/02. 아이콘\\accident.png')
------------------------------------------------------
True

위의 예시는 os.path.isfile(os.path.join(directoryPath, filename))의 결과 Tue 값을 반환하여
if os.path.isfile(os.path.join(directoryPath, filename)) 아래 명령문을 수행하게 됩니다.


fileExtension = filename.split(‘.’)[-1]

filename에 저장되어 있는 파일명을 dot(‘.’) 기준으로 분리하여 가장 왼쪽에 있는 값을 반환합니다.

filename = 'accident.png'

fileExtension = filename.split('.')[-1]
fileExtension
-----------------------------------------
'png'


destinationDirectory = os.path.join(directoryPath, fileExtension)

directoryPath에 저장되어 있는 파일경로명과 fileExtension에 저장되어 있는 파일명을 결합하여 destinationDirectory 에 저장합니다.

directoryPath = r'D:/zzinnam/02. 아이콘'

# fileExtension 저장값은 위의 코드에서 생성된 fileExtension 을 그대로 사용 
# fileExtension에는 'png' 값이 저장되어 있음
destinationDirectory = os.path.join(directoryPath, fileExtension)
destinationDirectory
--------------------------------------------------------------------------
'D:/zzinnam/02. 아이콘\\png'


if not os.path.exists(destinationDirectory) :

os.path.exists(destinationDirectory)는 destinationDirectory에 저장된 경로명이 존재여부를 확인하는 함수입니다.

os.path.exists(destinationDirectory)
--------------------------------------
False

‘D:/zzinnam/02. 아이콘\\png’ 경로명이 존재하지 않아 False를 반환하였습니다.
따라서 if not os.path.exists(destinationDirectory) : 의 의미는 ‘D:/zzinnam/02. 아이콘\\png’ 경로명이 존재하지 않는다면, 아래 명령문을 수행하라는 의미입니다.


os.makedirs(destinationDirectory)

os.makedirs(destinationDirectory)는 destinationDirectory의 경로명을 생성하라는 의미입니다.

# 아래 코드를 수행하면, 'D:/zzinnam/02. 아이콘\\png' 가 생성됨
os.makedirs(destinationDirectory)


move(os.path.join(directoryPath, filename), os.path.join(destinationDirectory, filename))

move(인수1, 인수2)함수는 인수1을 인수2로 이동시키는 함수입니다. 스크립트 설명 아래의 모든 코드를 순서대로 작성하셨다면, 아래 코드를 실행하시면 ‘D:/zzinnam/02. 아이콘’ 폴더에 있는 ‘accident.png’ 파일이 ‘D:/zzinnam/02. 아이콘/png’ 폴더로 이동한 것을 확인하실 수 있습니다.

move(os.path.join(directoryPath, filename), os.path.join(destinationDirectory, filename))

이번 포스팅에서는 파이썬 프로그램을 활용하여 폴더안에 있는 파일들을 정리하는 함수를 작성해 보았습니다. 간단한 프로그램으로 컴퓨 터 속 파일들을 정리해 보시는 건 어떨까요?

감사합니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다