본문 바로가기
Python/Basic

[파이썬, Python] 파이썬으로 파일 정리하기! 📂

by coding-choonsik 2023. 3. 14.
728x90
반응형
SMALL

📁예제에 사용한 압축파일

고라니.zip
0.29MB


1. zip 파일 있는지 알아보기

import os
imort glob

# 현재 경로 알아보기
os.getcwd()
>>> 'C:\\yesung\\jupyter'

# 정리 대상 폴더 경로를 설정
target_path = './고라니'

# 압축 파일 확인하기
zipfile_path = []

for filename in glob.glob(target_path, '**/*.zip'), recursive = True):  # 모든 zip파일
	zipfile_path.append(filename)
    print(zipfile_path)
    
>>> ['./고라니\\데이터저장_물류.zip']  # 고라니 폴더 안에 zip파일 한 개 있음

고라니 폴더 내 데이터

 

1-1. 압축 파일 해제하기

import zipfile


for filename in zipfile_path:
	with zipfile.ZipFile(filename) as myzip:
    	zipinfo = myzip.infolist()    # infolist(): zip파일의 정보
		print(zipinfo)
        for info in zipinfo:
        	

# 압축파일 해제하기

for filename in zipfile_path:
    with zipfile.ZipFile(filename) as myzip:
        zipinfo = myzip.infolist()   # infolist(): zip파일의 정보
        # print(zipinfo)
        for info in zipinfo:
            decode_name = info.filename.encode('cp437').decode('euc-kr')  #한글 깨짐 방지
            info.filename = os.path.join(target_path, decode_name)
            # print(info.filename)
            # print(decode_name)
            myzip.extract(info)
            print(info)
            
            
>>>
<ZipInfo filename='./고라니\\D_20220110_데이터저장_물류_001.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>
<ZipInfo filename='./고라니\\D_20220110_데이터저장_물류_002.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>
<ZipInfo filename='./고라니\\D_20220723_데이터저장_물류_001.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>
<ZipInfo filename='./고라니\\D_20220723_센터가동현황_물류_002.pdf' compress_type=deflate external_attr=0x20 file_size=13264 compress_size=12312>

 

압축해제가 잘 되었다.


2. 파일명 정리하기

  • openpyxl 사용

✅ excel 파일에서 아래와 같은 형식으로 작성하는 함수를 만들어보자.

# 라이브러리 설치
# !pip install openpyxl 

import openpyxl as opx
def getFileName(target_path):
    
    wb = opx.Workbook()    # 엑셀 객체 생성
    ws = wb.active         # 새로 생성한 WorkBook의 활성화 시트를 ws로 정의
    
    ws.cell(row=1, column=1).value = '파일경로'
    ws.cell(row=1, column=2).value = '파일명(변경전)'
    ws.cell(row=1, column=3).value = '파일명(변경후)'
    
    i = 2       #row = 1 : 제목
    
    current_dir = target_path
    filelist = os.listdir(current_dir)   # './고라니' 폴더 내 데이터를 list로 불러옴
    
    for filename in filelist:
        ws.cell(row=i, column=1).value = current_dir + "/"     # './고라니/'
        ws.cell(row=i, column=2).value = filename
        i += 1
    wb.save(os.path.join(target_path, 'filelist.xlsx'))
    
getFileName(target_path)   # 고라니 폴더의 모든 파일명을 입력

입력이 잘 되었다.


3. 파일명 변경하기

 

✅ filelist.xlsx 에서 변경하고자 하는 이름으로 변경해준다.

나는 4개만 변경하였다.

 

✅ 파일명을 변경하는 함수를 만들어보자.

def excel_read(filepath: str) -> list:
    wb = opx.load_workbook(filepath)   # 엑셀파일을 읽음
    
    ws = wb.active
     
    dirpath = [r[0].value for r in ws]       # 파일경로 열
    file_before = [r[1].value for r in ws]	 # 파일명(변경전) 열
    file_after = [r[2].value for r in ws]    # 파일명(변경후) 열
    
    len_num = len(dirpath)
    datalist = []
    
    for i in range(1,len_num):   # 0번은 제목
        temp_tup = (dirpath[i], file_before[i], file_after[i])   # 튜플형태로 저장
        datalist.append(temp_tup)   # 리스트에 튜플 추가
        
    return datalist
    
rename_list = excel_read(os.path.join(target_path, 'filelist.xlsx'))
print(rename_list[-2])
>>> ('./고라니/', '점심시간.txt', '저녁시간.txt')

 

✅ shutil 의 move()메소드로 파일명 덮어쓰기

 

import shutil
def fileRename(datalist : list):
    for data in datalist:
        print(data[1] + '의 파일명을 ' + data[2] + '로 변경합니다')
        shutil.move(data[0]+data[1], data[0]+data[2])


>>> A_2022_01_13_부서로그_인사_001.pdf의 파일명을 A_2022_01_13_부서로그_인사_001.pdf로 변경합니다
A_2022_01_13_부서로그_인사_002.pdf의 파일명을 A_2022_01_13_부서로그_인사_002.pdf로 변경합니다
A_2022_01_13_부서로그_인사_003.pdf의 파일명을 A_2022_01_13_부서로그_인사_003.pdf로 변경합니다
A_2022_04_10_생산로그_생산_001.pdf의 파일명을 A_2022_04_10_생산로그_생산_001.pdf로 변경합니다
A_2022_04_10_생산로그_생산_002.pdf의 파일명을 A_2022_04_10_생산로그_생산_002.pdf로 변경합니다
A_2022_04_10_생산로그_생산_003.pdf의 파일명을 A_2022_04_10_생산로그_생산_003.pdf로 변경합니다
A_2022_04_10_생산로그_생산_004.pdf의 파일명을 A_2022_04_10_생산로그_생산_004.pdf로 변경합니다
A_2022_06_30_생산로그_생산_001.pdf의 파일명을 A_2022_06_30_생산로그_생산_001.pdf로 변경합니다
A_2022_06_30_생산로그_생산_002.pdf의 파일명을 A_2022_06_30_생산로그_생산_002.pdf로 변경합니다
A_2022_07_20_부서로그_인사_001.pdf의 파일명을 A_2022_07_20_부서로그_인사_001.pdf로 변경합니다
A_2022_07_20_부서로그_인사_002.pdf의 파일명을 A_2022_07_20_부서로그_인사_002.pdf로 변경합니다
A_2022_07_20_부서로그_인사_003.pdf의 파일명을 A_2022_07_20_부서로그_인사_003.pdf로 변경합니다
A_2022_07_20_부서로그_인사_004 (1).pdf의 파일명을 A_2022_07_20_부서로그_인사_004.pdf로 변경합니다
B_2022_02_20_상반기_클래스설계_001.xlsx의 파일명을 B_2022_02_20_상반기_클래스설계_001.xlsx로 변경합니다
B_2022_02_20_상반기_클래스설계_002.xlsx의 파일명을 B_2022_02_20_상반기_클래스설계_002.xlsx로 변경합니다
B_2022_06_20_하반기_클래스설계_001.xlsx의 파일명을 B_2022_06_20_하반기_클래스설계_001.xlsx로 변경합니다
B_2022_06_30_하반기_클래스설계_002.xlsx의 파일명을 B_2022_06_30_하반기_클래스설계_002.xlsx로 변경합니다
C_2022_03_30_데이터베이스_ERD_001.xlsx의 파일명을 C_2022_03_30_데이터베이스_ERD_001.xlsx로 변경합니다
C_2022_03_30_데이터베이스_ERD_002.xlsx의 파일명을 C_2022_03_30_데이터베이스_ERD_002.xlsx로 변경합니다
C_2022_03_30_데이터베이스_ERD_003.xlsx의 파일명을 C_2022_03_30_데이터베이스_ERD_003.xlsx로 변경합니다
C_2022_09_10_데이터베이스_ERD_001 (1).xlsx의 파일명을 C_2022_09_10_데이터베이스_ERD_001.xlsx로 변경합니다
C_2022_09_10_데이터베이스_ERD_002.xlsx의 파일명을 C_2022_09_10_데이터베이스_ERD_002.xlsx로 변경합니다
C_2022_09_10_데이터베이스_ERD_003.xlsx의 파일명을 C_2022_09_10_데이터베이스_ERD_003.xlsx로 변경합니다
D_20220110_데이터저장_물류_001.pdf의 파일명을 D_20220110_데이터저장_물류_001.pdf로 변경합니다
D_20220110_데이터저장_물류_002.pdf의 파일명을 D_20220110_데이터저장_물류_002.pdf로 변경합니다
D_20220723_데이터저장_물류_001.pdf의 파일명을 D_20220723_데이터저장_물류_001.pdf로 변경합니다
D_20220723_센터가동현황_물류_002.pdf의 파일명을 D_20220723_센터가동현황_물류_002.pdf로 변경합니다
내사진.jpg의 파일명을 쌤사진.jpg로 변경합니다
데이터저장_물류.zip의 파일명을 데이터저장_물류.zip로 변경합니다
새파일1_복사본.txt의 파일명을 새파일1_복사본.txt로 변경합니다
점심시간.txt의 파일명을 저녁시간.txt로 변경합니다
주피터노트북.txt의 파일명을 주피터노트북.txt로 변경합니다

4. 폴더 생성하기

 

✅ '_'를 기준으로 split한 후 숫자 전의 한글로 category 폴더명 생성

import fnmatch

def categoryList(target_path:str) -> list:
    file_list = []
    for filename in os.listdir(target_path):
        if fnmatch.fnmatch(filename, '*_[0-9][0-9][0-9].*'):  # 앞의 내용은 상관없고_ 뒤로 번호3개, 모든확장자
            file_list.append(filename)
            
    category = []
    for file in file_list:
        temp_list =file.split('_')
        category.append(temp_list[-2])
        
    temp_set = set(category)
    result = list(temp_set)
    return result

categoryList(target_path)

category_list = categoryList(target_path) + ['기타']
print(category_list)
>>> ['클래스설계', 'ERD', '생산', '인사', '물류', '기타']

✅ category_list로 구성된 폴더를 만들어보자.

  • pathlib 모듈 사용:  파일시스템 경로를 단순한 문자열이 아니라 객체로 다룸
import pathlib
new_path = './new_dir'   # 카테고리 폴더를 생성할 폴더

def makeDir(new_path:str, category_list:list):
    for category in category_list:
        new_dir = pathlib.Path(os.path.join(new_path, category))  # ./new_dir/클래스설계..
        # mkdir(): 폴더 생성
        # parents: True - 상위 폴더에 new_path가 없으면 만듦
        # exist_ok: True - 기존에 폴더가 있으면 덮어씀, 안하면 에러
        new_dir.mkdir(parents=True, exist_ok=True)
        
makeDir(new_path, category_list)

같은 경로에 new_dir이라는 폴더 생성이 잘 되었다!

 


5. 파일 분류 및 이동하기

  • shutil 사용
import shutil

new_path = './new_dir'

def moveFile(new_path:str, target_path:str, category_list:list):
    dirlist = os.listdir(new_path)    	# 이동시킬 경로에 생성된 분류  dir 리스트
    filelist = os.listdir(target_path)  # 이동시킬 파일명 리스트
    categorydict = {}
    # assert 조건식 : False면 에러발생 
    for file in filelist:
        try:
            temp_list = file.split('_')
            assert temp_list[-2] in category_list  # 카테고리 리스트와 일치하지 않으면 에러 발생
            categorydict[file] = temp_list[-2]   # {'파일명':'분류명'}
                
        except:   	
            categorydict[file] = '기타'   # {'파일명': '기타'}
            
    # print(categorydict)
    for key, value in categorydict.items():     # items(): key와 value를 튜플로 반환
        shutil.copy(target_path+'/'+key, new_path+'/'+value)    
        # 예) './고라니/A_2022_01_13_부서로그_인사_001.pdf' -> './new_dir/인사' 로 복사

카테고리 분류로 폴더 생성

 

카테고리 분류별로 파일들이 복사되었다.

고라니 폴더 내에 파일들이 남아있다(복사했기 때문)


 

📄 주피터 노트북으로 작성한 파일

25_폴더 관리 프로그램 실습.ipynb
0.02MB

 

728x90
반응형
LIST