이전 포스팅에서는 엑셀 여러 폴더의 파일명을 일관된 규칙으로 넘버링을 하여 바꾸는 방법을 정리하였다.
(이전 포스팅 : 2021.06.01 - [코딩/업무자동화] - [파이썬/업무자동화] 여러 폴더 안에 있는 파일명 한번에 바꾸기 - os 모듈
오늘 포스팅에서는 규칙성있는 파일명이 아닌 각각 원하는 파일명으로 변경하기 위한 코드를 작성하였다.
프로그램 컨셉은 아래와 같다.
1) 여러 폴더에 있는 파일명의 경로 및 파일명을 엑셀파일에 입력하여 저장(.xlsx) 2) 위 저장된 파일에 변경시킬 파일명을 직접 입력. 3) 2에서 입력한 엑셀파일 데이터를 가지고 실제 파일명을 변경 |
이번 작성 코드는 os 모듈과 openpyxl 모듈을 활용하였다. 아래 내용을 이해하기 위해선 파이썬 openpyxl 모듈에 대한 기초적인 사용법을 이해하고 있어야 한다.
1. 모듈 import
<코드>
import os
import openpyxl as op
2. 함수 작성
함수는 크게 3가지로 정의했다. (getFileName, excelRead, fileRename)
1) getFileName
-. getFileName 함수는 여러 폴더가 있는 폴더의 경로를 받아 폴더내부 파일명 파일을 받아온다.
-. openpyxl 모듈을 활용해 엑셀파일을 1개 생성하여 위 파일명과 경로를 입력하여 저장한다.
<코드>
#폴더별 파일명 받아 엑셀파일에 작성하는 함수
def getFileName(folderpath):
#여러 폴더가 있는 폴더경로를 입력받아 list화 한다.
folderlist = os.listdir(folderpath)
#openpyxl Workbook 생성
wb = op.Workbook()
#새로 생성한 Workbook의 활성화 시트를 ws로 정의
ws = wb.active
i=1
#각 폴더를 for문을 통해 접근
for fname1 in folderlist:
current_folder = folderpath + "/" + fname1 #현재 폴더 위치
filelist = os.listdir(current_folder) #현재 폴더 위치의 파일들을 리스트화
#현재 폴더 위치의 리스트화 된 파일을 다시 for문을 통해 접근
for fname2 in filelist:
ws.cell(row=i, column=1).value = current_folder + "/" #i행 1열에 현재 폴더 경로 입력
ws.cell(row=i, column=2).value = fname2 #i행 2열에 파일명(변경전) 입력
i=i+1
ws.cell(row=1,column=1).value = "파일경로"
ws.cell(row=1,column=2).value = "파일명(변경전)"
ws.cell(row=1,column=3).value = "파일명(변경후)"
#위에서 작성 된 엑셀파일을 filelist.xlsx라는 이름으로 저장
wb.save("filelist.xlsx")
<결과>
-. 파일경로를 따로 표시한 이유는 여러 폴더에 같은 파일명이 있을 경우를 처리하기 위함이다.
(파일명을 바꿀 때 경로로 접근하므로 같은 파일명이 있어도 문제 안됨)
-. 먼저 위 getFileName에서 저장 된 엑셀파일에 직접 '변경후' 파일명을 입력해줘야한다. 임의로 test로 지정하긴 했지만 아무 이름으로 해도 된다.
-. 제대로 변경하기 위해선 원래 파일 확장자(.txt)까지 붙여줘야 한다.
2) excelRead
-. excelRead 함수는 위 변경후 파일명을 입력한 엑셀파일을 읽어와 데이터를 튜플로 구성 된 리스트로 반환해준다.
<코드>
def excelRead(filepath : str) -> tuple:
#filelist.xlsx 경로를 받아 workbook 객체 생성
wb = op.load_workbook(filepath)
#활성화 된 시트 ws로 정의
ws = wb.active
#리스트 컴프리헨션 구문을 통해 각 열의 데이터를 리스트화하기
folderpath = [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(folderpath) #for문을 위한 열 개수 구하기(folderpath 개수)
datalist = [] #빈 리스트 생성
for i in range(0, len_num):
temp_tuple = (folderpath[i], file_before[i], file_after[i]) #임시 튜플 생성(각 행 데이터)
datalist.append(temp_tuple) #위 튜플을 datalist에 추가
return datalist #datalist 리턴
<결과>
-. 위 datalist를 출력해보면 아래와 같다.(튜플로 이루어진 리스트)
3) fileRename
-. 2) 함수에서 리턴된 datalist를 인수로 입력받아 실제 파일명을 바꾸는 함수이다.
-. os.rename 함수의 경우 이전편에서 설명했기에 설명을 생략.
(참고 : 2021.06.01 - [코딩/업무자동화] - [파이썬/업무자동화] 여러 폴더 안에 있는 파일명 한번에 바꾸기 - os 모듈)
-. 입력받은 인수인 datalist가 튜플로 이루어진 리스트이기에 리스트의 각 요소에 접근시 인덱싱으로 접근한다.
<코드>
def fileRename(datalist : list):
for data in datalist:
print(data[1]+"의 파일명을"+data[2]+"로 변경합니다.")
#data[0] : 폴더경로, data[1] : 변경전 파일명, data[2] : 변경 후 파일명
os.rename(data[0]+data[1], data[0]+data[2])
<결과>
고양이미로화이팅.txt의 파일명을Test1.txt로 변경합니다.
블로그번창기원.txt의 파일명을Test2.txt로 변경합니다.
코딩유치원화이팅.txt의 파일명을Test3.txt로 변경합니다.
투손플레이스화이팅.txt의 파일명을Test4.txt로 변경합니다.
1일1포스팅화이팅.txt의 파일명을Test5.txt로 변경합니다.
고양이미로화이팅.txt의 파일명을Test6.txt로 변경합니다.
블로그번창기원.txt의 파일명을Test7.txt로 변경합니다.
코딩유치원화이팅.txt의 파일명을Test8.txt로 변경합니다.
투손플레이스화이팅.txt의 파일명을Test9.txt로 변경합니다.
1일1포스팅화이팅.txt의 파일명을Test10.txt로 변경합니다.
고양이미로화이팅.txt의 파일명을Test11.txt로 변경합니다.
블로그번창기원.txt의 파일명을Test12.txt로 변경합니다.
코딩유치원화이팅.txt의 파일명을Test13.txt로 변경합니다.
투손플레이스화이팅.txt의 파일명을Test14.txt로 변경합니다.
4. 전체 코드
<코드>
import os
import openpyxl as op
#폴더별 파일명 받아 엑셀파일에 작성하기
def getFileName(folderpath):
folderlist = os.listdir(folderpath)
wb = op.Workbook()
ws = wb.active
i=1
for fname1 in folderlist:
current_folder = folderpath + "/" + fname1
filelist = os.listdir(current_folder)
for fname2 in filelist:
ws.cell(row=i, column=1).value = current_folder + "/"
ws.cell(row=i, column=2).value = fname2
i=i+1
ws.cell(row=1,column=1).value = "파일경로"
ws.cell(row=1,column=2).value = "파일명(변경전)"
ws.cell(row=1,column=3).value = "파일명(변경후)"
wb.save("./Project/filerename/filelist.xlsx")
def excelRead(filepath : str) -> tuple:
wb = op.load_workbook(filepath)
ws = wb.active
folderpath = [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(folderpath)
datalist = []
for i in range(0, len_num):
temp_tuple = (folderpath[i], file_before[i], file_after[i])
datalist.append(temp_tuple)
del datalist[0]
for data in datalist:
print(data)
return datalist
def fileRename(datalist : list):
for data in datalist:
print(data[1]+"의 파일명을"+data[2]+"로 변경합니다.")
os.rename(data[0]+data[1], data[0]+data[2])
#실행
folderpath = r"이름 바꿀 폴더 경로"
getFileName(folderpath)
excelpath = r"엑셀파일 filelist.xlsx 경로"
datalist = excelRead(excelpath)
fileRename(datalist)
'코딩 > 업무자동화' 카테고리의 다른 글
[파이썬/업무자동화] 여러 엑셀 파일의 모든 시트 하이퍼링크 걸기 (1) | 2021.06.23 |
---|---|
[파이썬/업무자동화] 엑셀 파일 시트별 pdf 저장/변환하기 (18) | 2021.06.21 |
[파이썬/업무자동화] 특정 문자 기준으로 문자열 분리 및 나열 (0) | 2021.06.13 |
[파이썬/업무자동화] 여러 폴더 안에 있는 파일명 한번에 바꾸기 1편 (1) | 2021.06.01 |
[파이썬/업무자동화] Outlook 메일 첨부 엑셀 내용 자동 취합하기 (0) | 2021.04.28 |