728x90
반응형
SMALL

1. 압축파일 정리하기

 

 

# 현재 폴더 위치 확인
import os
os.getcwd()
 
'C:\\eadgnus\\python\\jupyter'
 

 

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

 

# 압축 파일 확인
import glob
zipfile_path = []
for filename in glob.glob(os.path.join(target_path, '**/*.zip'), recursive=True):
    zipfile_path.append(filename)
    print(zipfile_path)
 
['./고라니\\데이터저장_물류.zip']

 

# 압축파일 해제
import zipfile

for filename in zipfile_path:
    with zipfile.ZipFile(filename) as myzip:
        zipinfo = myzip.infolist() # zip 파일 정보
        for info in zipinfo:
            decode_name = info.filename.encode('cp437').decode('euc-kr') # 한글 깨짐 방지
            info.filename = os.path.join(target_path, decode_name)
            myzip.extract(info)
 

2. 파일명 정리하기


 

# 주피터, 코랩 노트북에서 리눅스 환경 명령어로 모듈 설치
!pip install openpyxl
 

 

import openpyxl as opx
 

 

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

 

# 폴더별 파일명을 입력 받아 엑셀 파일에 저장하는 함수

def getFileName(target_path):
    dir_list = os.listdir(target_path) # 고라니 폴더 안의 파일 확인
#     print(dir_list)

    wb = opx.Workbook() # 엑셀을 생성하는 객체
    ws = wb.active      # 새로 생성한 workbook의 활성화 시트를 ws로 정의
    
            #행    #열
    ws.cell(row=1, column=1).value = '파일경로' # 첫번째 로우 1번 컬럼에 파일경로로 입력
    ws.cell(row=1, column=2).value = '파일명(변경전)'
    ws.cell(row=1, column=3).value = '파일명(변경후)'
    

    
    i = 2 # 1 행에는 입력이 다 되어서 2행부터 입력할거라 2로 줌
    
    current_dir = target_path # 고라니폴더 경로 변수로 지정
    filelist = os.listdir(current_dir) # 고라니 폴더 안의 파일이름들 변수로 지정
    
    for filename in filelist:
        ws.cell(row = i, column = 1).value = current_dir +"/" 
        # ws엑셀을 .cell(i행 1열부터 값을 고라니폴더경로에서 하위 경로를 표현해주기위해 / 더한것 )
        
        ws.cell(row = i, column = 2).value = filename
        # ws엑셀을 i행 2열에 파일이름을 i증가하는값에다가 하나씩 넣기
        i += 1
    
    wb.save(os.path.join(target_path, 'filelist.xlsx'))
 
 

 

# 선생님 코드

# 폴더별 파일명을 입력 받아 엑셀파일에 저장하는 함수
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
    current_dir = target_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(target_path, 'filelist.xlsx'))
 

 

getFileName(target_path)
 

3. 파일명 변경하기


 

def excelRead(file_path : str) -> tuple:
    
    wb = opx.load_workbook(file_path)
    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) # for문 몇바퀴 돌까
    datalist = []
    
    for i in range(1, len_num):
        temp_tuple = (dirpath[i], file_before[i], file_after[i])
        datalist.append(temp_tuple)

    return datalist
 

 

rename_list = excelRead(os.path.join(target_path, 'filelist.xlsx'))
print(rename_list)
 
[('./고라니/', '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'), ('./고라니/', 'filelist.xlsx', 'filelist.xlsx'), ('./고라니/', '내사진.jpg', '내사진.jpg'), ('./고라니/', '데이터저장_물류.zip', '데이터저장_물류.zip'), ('./고라니/', '새파일1_복사본.txt', '새파일1_복사본.txt'), ('./고라니/', '점심시간.txt', '저녁시간.txt'), ('./고라니/', '주피터노트북.txt', '주피터노트북.txt')]

 

# 파일 이름 변경하기
import shutil

def fileRename(datalist : list):
    try:
        for data in datalist:
            print(data[1] + '의 파일명을 -> ' + data[2] + '로 변경합니다')
            shutil.move(data[0] + data[1], data[0] + data[2])
    except FileNotFoundError as e:
        print('이미 변경되었습니다.')
 

 

fileRename(rename_list)
 
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로 변경합니다
이미 변경되었습니다.

4. 폴더 생성하기


 

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].*'):
            file_list.append(filename)
            
    category = []
    for file in file_list:
        
        # A_2022_06_30_생산로그_생산_002 이라면
        temp_list = file.split('_') # ['b', '2022', '02', .... 이런식으로 저장됌]
        category.append(temp_list[-2]) # 생산 부분에 있는글자를 리스트에 추가한다.
        
    temp_set = set(category)
    result = list(temp_set)
    return result
        

 

 

categoryList(target_path)
 
['물류', '생산', '클래스설계', 'ERD', '인사']

 

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

 

# 폴더 생성하기
import pathlib
 

 

new_path = './new_dir'

def makeDir(new_path:str, categorylist:list):
    for category in categorylist:
        new_dir = pathlib.Path(os.path.join(new_path, category))
        new_dir.mkdir(parents=True, exist_ok=True) # 부모폴더가 없으면 만들고 # 이미 존재하면 덮어쓰기
 

 

makeDir(new_path, categorylist)
 

5. 파일 분류 및 이동하기


 

import shutil
 

 

new_path = './new_dir'
target_path = './고라니'
categorylist = categoryList(target_path) + ['기타']
 

 

 

 

 
 

 

728x90
반응형
LIST

'파이썬' 카테고리의 다른 글

MySQL client 라이브러리  (0) 2023.03.22
DAO,DTO,VO  (0) 2023.03.22
파일 입출력 라이브러리  (0) 2023.03.14
데코레이터(Decorator) - 함수 꾸며주기  (0) 2023.03.13
클로저(Closure)  (0) 2023.03.13

+ Recent posts