과제
위 디렉토리 관리 프로그램을 참고하여 자신의 시나리오를 만들고 파일 관련된 프로그램을 작성해보자.
점심메뉴 폴더
점심메뉴 폴더에는 한식, 중식, 일식, 양식, 아시안, 기타 파일이 들어있음.
코드 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번 선택 : 종료
'Python > 개념' 카테고리의 다른 글
2024_06-03 29. 데이터베이스와 MongoDB (0) | 2024.06.03 |
---|---|
2024-03-29 재귀 호출 (0) | 2024.03.29 |
2024-03-22 주피터 노트북 설치, 디렉토리 관리 프로그램 (0) | 2024.03.22 |
2024-03-21 파일 입출력 라이브러리 (0) | 2024.03.21 |
2024-03-21 변수 타입 어노테이션 (0) | 2024.03.21 |