Python/개념

2024-03-22 과제 디렉토리 관리 프로그램 만들기

nomad06 2024. 3. 22. 15:49

과제

위 디렉토리 관리 프로그램을 참고하여 자신의 시나리오를 만들고 파일 관련된 프로그램을 작성해보자.

 

점심메뉴 폴더

 

점심메뉴 폴더에는 한식, 중식, 일식, 양식, 아시안, 기타 파일이 들어있음.

 

코드  class 사용

import os
import glob
import zipfile
import shutil
import fnmatch
import pathlib
import openpyxl as opx
class DirManagement:
    def __init__(self, path = './점심메뉴'):
        self.path = path

    # 압축 파일 해제하기
    def extract(self, path):
        zipfile_path = []
        for filename in glob.glob(os.path.join(self.path, '**/*.zip'), recursive= True):
            zipfile_path.append(filename)
#         print(zipfile_path)
        for filename in zipfile_path:
            with zipfile.ZipFile(filename) as myzip:
                zipinfo = myzip.infolist()
                # print(zipinfo) # 압축파일 정보
                for info in zipinfo:
                    decode_name = info.filename.encode('cp437').decode('euc-kr') 
                    info.filename = os.path.join(self.path, decode_name)        
                    myzip.extract(info)   
    
    # 파일명 정리하기 
    def getFileName(self, path):
        wb = opx.Workbook()  # 엑셀을 사용할 수 있는 객체 생성
        ws = wb.active       # active => 작업 모드
        ws.cell(row=1, column=1).value = '파일경로'
        ws.cell(row=1, column=2).value = '파일명(변경전)'
        ws.cell(row=1, column=3).value = '파일명(변경후)'
        i = 2
        current_dir = self.path
        filelist = os.listdir(current_dir)
        for filename in filelist:
            ws.cell(row=i, column=1).value = current_dir + '/' 
            ws.cell(row=i, column=2).value = filename
            i = i + 1
        wb.save(os.path.join(self.path, 'foodlist.xlsx'))
        
    # 파일이름 변경하기  => 폴더에서 확인하면 파일이름 변경되어있음 
    def fileRename(self, path):
        wb = opx.load_workbook(os.path.join(self.path, 'foodlist.xlsx'))
        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]
        datalist = []

        # 1행 안뜨는것
        len_num = len(dirpath)
        categorylist = []
        for i in range(1, len_num):
            temp_tuple = (dirpath[i], file_before[i], file_after[i])
            datalist.append(temp_tuple)
        
        for data in datalist:
#             print(data[1] + '의 파일명을 ' + data[2] + '로 변경합니다')
            shutil.move(data[0]+data[1], data[0]+data[2])
    
    def makeDir(self, path):
        file_list = []
        for filename in os.listdir(self.path):
            if fnmatch.fnmatch(filename, '*_[0-9][0-9][0-9].*'):
                file_list.append(filename)
        category = []
        # A_2022_04_10_생산로그_한식_001.pdf
        for file in file_list:
            temp_list = file.split('_') 
            category.append(temp_list[-2])
        category = set(category)
        categorylist = list(category) +['기타']
        
        new_path = './new_점심메뉴' 
        for category in categorylist:
            new_dir = pathlib.Path(os.path.join(new_path, category))
            new_dir.mkdir(parents=True, exist_ok=True) 
        return new_path, categorylist
            
    def moveFile(self, path, new_path, categorylist):
        dirlist = os.listdir(new_path)  
        filelist = os.listdir(self.path)
        categorydic = {}

        for file in filelist:
            try:
                temp_list = file.split('_')
                assert temp_list[-2] in categorylist
                categorydic[file] = temp_list[-2] # {'파일명':'분류명'}
            except:
                categorydic[file] = '기타' # {'파일명':'기타'}

        for key, value in categorydic.items():
            shutil.copy(self.path + '/' + key, new_path + '/' + value)
class Menu:
    def __init__(self, path='./점심메뉴'):
        self.path = path
        self.service = DirManagement(path)

    def run(self, path='./점심메뉴'):
        while True:
            try:
                menu = int(input('1.압축해제 2.파일명정리 3.이름변경 4.폴더만들기 5.이동 6.종료하기: '))
                if menu == 1:
                    self.service.extract('./점심메뉴')
                elif menu == 2:
                    self.service.getFileName('./점심메뉴')
                elif menu == 3:
                    self.service.fileRename('./점심메뉴')
                elif menu == 4:
                    self.service.makeDir('./점심메뉴')
                elif menu == 5:
                    p,c = self.service.makeDir('./점심메뉴')
                    self.service.moveFile('./점심메뉴', p, c)
                elif menu == 6:
                    print('프로그램을 종료합니다')
                    break
            except Exception as e:
                print(e)
                print('다시 입력하세요!')
start = Menu()
start.run()

 

 

1번 선택 : 압축해제 

 

2번 선택 : 파일명정리

 

 

3번 선택 : 이름변경

 

4번 선택 : 폴더만들기

 

 

5번 선택 : 파일 이동

 

 

6번 선택 : 종료