본문 바로가기

카테고리 없음

2024.03.22 9일차

랜덤의 파일을 'C:\gisan\kdt 3\python\jupyter' 로컬디스크 c에 임의에 파일을 만들어 경로를 지정해 저장해준다.

 

랜덤의 파일을 압축 해제 하여 저장해준다.

import os
import glob
import zipfile
import shutil
import fnmatch
import pathlib
  1. os: 이 모듈은 운영 체제와 상호 작용하기 위한 여러 함수를 제공합니다. 파일 및 디렉터리 조작, 환경 변수 액세스 등이 가능합니다.
  2. glob: 파일 이름을 패턴 매칭하여 파일들의 리스트를 검색하는 데 사용됩니다.
  3. zipfile: ZIP 파일을 생성하고 읽는 데 사용됩니다.
  4. shutil: 파일 및 디렉터리 조작을 위한 고수준의 파일 작업 함수를 제공합니다.
  5. fnmatch: 파일 이름을 패턴 매칭하는 데 사용됩니다.
  6. pathlib: 파일 시스템 경로를 조작하기 위한 객체 지향적 인터페이스를 제공합니다.
# 현재 경로 알아보기

os.getcwd()
'C:\\Minwoo\\KDT3\\Python\\jupyter\\filemanager'

현재 파일의 경로를 알려준다

# 정리 대상 디렉토리 경로 설정하기
target_path = './정리'

이 코드에서 target_path = './정리'는 작업 대상 디렉터리의 경로를 나타낸다.

# for filename in glob.glob('**/*.zip'):
#     print(filename)

glob.glob('**/*.zip'): 이 부분은 현재 작업 디렉터리 및 하위 디렉터리에서 확장자가 '.zip'인 파일을 검색한다. '**/'는 모든 하위 디렉터리를 나타내며, *.zip는 확장자가 '.zip'인 모든 파일을 나타낸다. glob.glob() 함수는 해당 패턴에 매칭되는 파일들의 리스트를 반환한다.

# '정리' 디렉토리에서 압축 파일 확인하기
zipfile_path =[]
for filename in glob.glob(os.path.join(target_path,'**/*.zip'),recursive = True):
    zipfile_path.append(filename)
print(zipfile_path)

이 코드는 target_path로 지정된 디렉터리 및 하위 디렉터리에서 확장자가 '.zip'인 파일들을 검색하여 그 파일들의 경로를 리스트에 추가하고, 해당 리스트를 출력한다

['./정리\\데이터저장_물류.zip']

 

파일명 정리하기
!pip install openpyxl

openpyxl은 엑셀 파일(.xlsx, .xlsm, .xltx, xltm 등)을 읽고 쓸 수 있는 기능을 제공하는 Python 라이브러리이다. Python Office Open XML 형식을 읽고 쓸 수 있는 라이브러리가 별로 없어서 만들어졌다고 한다.

import openpyxl as opx

import openpyxl as opx는 Python에서 openpyxl 라이브러리를 opx라는 별칭으로 가져오는 것을 의미합니다.

따라서 import openpyxl as opx는 openpyxl 라이브러리를 opx라는 이름으로 사용하겠다는 것을 선언하는 것이다. 이렇게 하면 코드에서 opx를 사용하여 openpyxl의 기능을 호출할 수 있다.

def getFileName(target_path):
    wb = opx.Workbook()
    ws = wb.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 = 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'))

랜덤의 파일이 엑셀로 코딩한것처럼 정리가 된다.

 

파일명 변경하기
wb = opx.load_workbook(os.path.join(target_path, 'filelist.xlsx'))
ws = wb.active

위에서 만들어낸 엑셀 파일 filelist.xlsx 을 변수 ws에 저장하여 이후 코드에서는 이 활성 시트를 사용하여 Excel 파일의 내용을 읽거나 수정할 수 있다.

dirpath = [r[0].value for r in ws]
file_before = [r[1].value for r in ws]

이 코드는 엑셀 시트에서 특정 열의 값을 가져와서 리스트에 저장하는 것이다. 이렇게 하면 각 리스트에는 시트의 각 행에서 해당하는 열의 값들이 저장된다

def excelRead(filepath):
    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]
    datalist = []
    # for i in zip(dirpath, file_before, file_after):
    #     datalist.append(i)
    len_num= len(dirpath)
    for i in range(1, len_num):
        temp_tuple = (dirpath[i], file_before[i], file_after[i])
        datalist.append(temp_tuple)
    return datalist

따라서 이 함수는 입력된 Excel 파일에서 세 개의 열의 값을 가져와 튜플로 묶은 후 리스트에 저장하여 반환한다.

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

따라서 이 함수는 datalist에 있는 각 파일의 이름을 변경합니다. 함수를 호출하면 파일의 이름이 변경되며, 변경된 내용은 출력된다.

 

 
 
def categoryList(target_path):
    file_list = []
    for filename in os.listdir(target_path):
        # A_2022_01_13_부서로그_인사_001.pdf
        if fnmatch.fnmatch(filename,'*_[0-9][0-9][0-9].*'):
            file_list.append(filename)
    category =[]
    for file in file_list:
        temp_list = file.split('_') # ['A','2022','01','13','부서로그','인사','001.pdf']
        category.append(temp_list[-2])
    category = set(category)
    return list(category)
 
categoryList(target_path)
['생산', '물류', '인사', 'ERD', '클래스설계']​

카테고리 따로 나눠서 분류하는 리스트를 만들어 보자

따라서 이 패턴은 파일 이름이 어떤 문자열로 시작하여 언더스코어(_)가 있고, 그 뒤에 세 자리 숫자가 오고, 그 뒤에는 임의의 문자열이 뒤따라야 함을 나타낸다. 이 패턴은 일반적으로 특정 형식을 따르는 파일 이름을 찾는 데 사용된다.

 

 
categorylist = categoryList(target_path) + ['기타']
print(categorylist)
 
['생산', '물류', '인사', 'ERD', '클래스설계', '기타']
기타도 따로 추가해줘도 된다.
 
new_path = './new_정리'
def makeDir(new_path,categorylist):
    for category in categorylist:
        new_dir= pathlib.Path(os.path.join(new_path, category))
        #'./new_정리'+'/클래스설계','/물류','/생산'..
        # parents : 상위 디렉토리가 없을 경우 상위 디렉토리도 생성
        # exist_ok : 디렉토리가 이미 존재하는 경우 오류를 발생시키지 않도록 함
        new_dir.mkdir(parents =True,exist_ok = True)
makeDir(new_path, categorylist)

새롭게 파일을 정리하기위해 새로운 파일을 만들어 준다

ef moveFile(new_path,target_path,categorylist):
    dirlist = os.listdir(new_path)
    filelist = os.listdir(target_path)

    categorydic = {}

    for file in filelist:
        try:
            temp_list = file.split('_')
            assert temp_list[-2] in categorylist
            categorydic[file] = temp_list[-2] # {'파일명':'분류명'} # -2가 없는애들 은 txt 같은애들
                                            # [file] 은 key 임
        except:
            categorydic[file] ='기타' # {'파일명':'기타'}
    for key,value in categorydic.items(): # items() 키,밸류 값 나옴
        shutil.copy(target_path +'/'+ key, new_path +'/' + value)
moveFile(new_path,target_path,categorylist) # 아래오류는 이미 파일들이 다 들어가있어서 뜬거임

 

위에 리스트로 정렬해놓은 대로 파일들이 분류되어 들어간다.