이번 포스팅에서는 컴퓨터에 빈 폴더를 찾아 이를 제거해 주는 빈 폴더 제거용 파이썬 함수를 생성해 보겠습니다. 아무 의미 없이 비어 있는 폴더를 일일이 찾아 지우는 번거로운 작업을 매우 효율적으로 처리할 수 있습니다.
빈 폴더 제거용 파이썬 함수
최종 파이썬 스크립트
아래 함수는 비어 있는 폴더를 찾아 제거해 주는 파이썬 스크립트입니다.
import os
def remove_empty_folders(directoryPath):
for root, dirs, files in os.walk(directoryPath, topdown = False):
for folder in dirs:
folderPath = os.path.join(root, folder)
if not os.listdir(folderPath):
os.rmdir(folderPath)
함수 실행 결과
위에서 정의한 함수를 활용하여 ‘D:\zzinnam\02. 아이콘’ 경로에 있는 폴더들 중 비어 있는 폴더를 제거하기 위한 예제는 아래와 같습니다.
remove_empty_folders(r'D:/zzinnam/02. 아이콘')
빈 폴더 제거용 파이썬 함수 코드에 대한 상세 설명
import os
os 모듈에서 제공하는 함수를 사용하기 위해 os 모듈을 로딩하는 코드입니다. os 모듈은 운영체제에서 제공하는 여러 기능을 파이썬에서 수행할 수 있게 해주는 모듈입니다.
def remove_empty_folders(directoryPath):
인수 1개(directoryPath)를 가지는 remove_empty_folders 함수를 생성하기 위해 정의합니다.
for root, dirs, files in os.walk(directoryPath, topdown = False):
os.walk(directoryPath)는 directoryPath에 지정된 경로명 아래에 있는 모든 폴더와 파일을 튜플 형태로 반환하는 함수이고, 반환 값은 (루트 경로 명, 루트 경로 하위에 있는 폴더명, 루트 경로 하위에 있는 파일명)입니다.
topdown 옵션으로 탐색 순서를 결정할 수 있습니다. 기본값은 top-down 방식입니다. topdown = False 옵션을 주면, bottom-up 방식으로 탐색합니다. 아래는 ‘D:/zzinnam/02. 아이콘’ 경로에 있는 모든 폴더와 파일을 bottom-up 방식으로 탐색하여 출력해 주는 코드입니다.
import os
directoryPath = r'D:/zzinnam/02. 아이콘'
for (root, dirs, files) in os.walk(directoryPath, topdown = False) :
print(root, ' ', dirs, ' ', files)
---------------------------------------------------------------------
D:/zzinnam/02. 아이콘\png [] ['accident.png', 'alcohol.png', 'barchart.png', 'chart.png', 'clock.png', 'cloud.png', 'covid19.png', 'Decision.png', 'drone.png', 'firworks.png', 'gear.png', 'in out.png', 'mail.png', 'map.png', 'soccer.png', 'star.png', 'thinking.png', 'violence.png', 'WORK-AND-LIFE-BALANCE.png']
D:/zzinnam/02. 아이콘\svg [] ['accident.svg', 'alcohol.svg', 'barchart.svg', 'chart.svg', 'clock.svg', 'cloud.svg', 'covid19.svg', 'Decision.svg', 'drone.svg', 'firworks.svg', 'gear.svg', 'in-out.svg', 'mail.svg', 'map.svg', 'soccer.svg', 'star.svg', 'thinking.svg', 'violence.svg', 'WORK-AND-LIFE-BALANCE.svg']
D:/zzinnam/02. 아이콘\tempFolder [] []
D:/zzinnam/02. 아이콘 ['png', 'svg', 'tempFolder'] ['gear.png']
for 문은 총 4번 반복되었습니다.
bottom-up 방식으로 출력했기 때문에
첫 번째 출력을 보면,
- 루트 경로 명: D:/zzinnam/02. 아이콘\png
- 루트 경로 하위에 있는 폴더명: [] 없음
- 루트 경로 하위에 있는 파일명: [‘accident.png’, ‘alcohol.png’, ‘barchart.png’, ‘chart.png’, ‘clock.png’, ‘cloud.png’, ‘covid19.png’, ‘Decision.png’, ‘drone.png’, ‘firworks.png’, ‘gear.png’, ‘in out.png’, ‘mail.png’, ‘map.png’, ‘soccer.png’, ‘star.png’, ‘thinking.png’, ‘violence.png’, ‘WORK-AND-LIFE-BALANCE.png’]
마지막 출력을 보면,
- 루트 경로 명: D:/zzinnam/02. 아이콘
- 루트 경로 하위에 있는 폴더명: [‘png’, ‘svg’, ‘tempFolder’]
- 루트 경로 하위에 있는 파일명: [‘gear.png’]
임을 알 수 있습니다.
따라서 for root, dirs, files in os.walk(directoryPath, topdown = False): 는 directoryPath 에 있는 모든 폴더와 파일을 탐색하며, for 문 안에 있는 명령문을 실행한다는 의미입니다.
for folder in dirs:
for root, dirs, files in os.walk(directoryPath, topdown = False): 반복문 안에 존재하는 for 반복문입니다.
folderPath = os.path.join(root, folder)
루프 경로명과 하위 폴더명을 결합한 경로명을 반환합니다. 중첩 for문이 돌아 가는 동안 folder 값을 가지는 경우는 첫 for문의 4번째 반복 수행될 때이고, 이 때 folder 가 가지는 값은 순차적으로 ‘png’, ‘svg’, ‘tempFolder’ 입니다. 따라서, 출력 결과를 보면 총 3개의 결과값이 나오는 것을 확인하실 수 있습니다.
for root, dirs, files in os.walk(directoryPath, topdown = False):
for folder in dirs:
folderPath = os.path.join(root, folder)
print(folderPath)
-----------------------------------------------------------------
D:/zzinnam/02. 아이콘\png
D:/zzinnam/02. 아이콘\svg
D:/zzinnam/02. 아이콘\tempFolder
if not os.listdir(folderPath):
os.listdir(folderPath)는 folderPath 경로명에 존재하는 모든 파일들을 리스트 형태로 반환하는 함수입니다.
os.listdir(r'D:/zzinnam/02. 아이콘\png')
-------------------------------------------
['accident.png',
'alcohol.png',
'barchart.png',
'chart.png',
'clock.png',
'cloud.png',
'covid19.png',
'Decision.png',
'drone.png',
'firworks.png',
'gear.png',
'in out.png',
'mail.png',
'map.png',
'soccer.png',
'star.png',
'thinking.png',
'violence.png',
'WORK-AND-LIFE-BALANCE.png']
‘D:/zzinnam/02. 아이콘\png’ 경로에는 ‘accident.png’ 파일부터 ‘WORK-AND-LIFE-BALANCE.png’ 파일까지 총 19개의 파일이 존재합니다.
if not os.listdir(folderPath): 는 결국 folderPath 경로에 파일이 존재하지 않을 경우, if 문에 영향을 받는 하위 명령문을 실행하라는 의미입니다.
os.rmdir(folderPath)
‘folderPath’ 에 있는 경로명을 삭제하는 함수입니다.
def remove_empty_folders(directoryPath):
for root, dirs, files in os.walk(directoryPath, topdown = False):
for folder in dirs:
folderPath = os.path.join(root, folder)
if not os.listdir(folderPath):
os.rmdir(folderPath)
이상으로 컴퓨터에 존재하는 빈 폴더를 제거하는 프로그램을 작성해 보았습니다. 가끔씩 컴퓨터를 정리하는 용도로 사용해도 좋을 거 같습니다.
감사합니다!