안녕하세요!
이번에 공유하려는 코드는 인턴 다니던 시절 겪었던 업무를 자동화하려고, 구글링 하며 여러 분들의 코드를 참고하며 짰었던 것입니다.
이런 상황에 있는 분들에게 해당 코드가 도움이 될 것 같습니다.
1. 파일 이름을 바꿔야 하는데, 파일이 너무 많은 경우
2. 바꾸려는 파일 이름들이 엑셀 데이터로 저장되어 있는 경우
파이썬을 사용하면 일일이 입력하면서 바꾸는 것보다 훨씬 빠르고 정확하게 할 수 있습니다.
코드 각 줄에 대한 설명이 없는 전체 코드는 제일 하단에 첨부하겠습니다.
최종 코드 실행 영상은 [결과]와 같습니다.
코드 내용도 간단하고, pdf, xlsx, word 등 여러 파일 형태가 섞여 있는 상황에도 관계없이 적용할 수 있으니, 예시를 보며 차례차례 진행해 보면 좋을 것 같습니다.
먼저 바꾸려는 파일명이 담겨 있는 엑셀의 데이터[그림1]와 바꾸기 전 파일명이[그림2]이 다음과 같다고 가정해 봅시다.
1) 먼저 코드 실행에 필요한 라이브러리를 설치 및 불러옵니다.
## 1. 기본 세팅
# 1-1 pandas 라이브러리를 설치해줍니다.
!pip install pandas
# 1-2 pandas 라이버리리와 os 모듈을 불러옵니다.
# 이때 os는 파이썬 설치 시 같이 설치되는 표준 모듈이기 때문에, 따로 설치하지 않아도 괜찮습니다.
import pandas as pd
import os
2) 바꾸고 싶은 파일 이름들이 입력되어 있는 엑셀 데이터를 가져옵니다.
## 2. 파일 불러오기
# 2-1 바꾸려는 파일명이 담겨있는 엑셀 데이터 경로 설정해주기
os.chdir('C:/Users/Desktop')
# 예시 코드에서는 바탕화면에 엑셀 파일이 있다는 것을 알려주는 것입니다.
# 경로 입력 시 역슬래시(\)가 아닌 슬래시로(/) 되어있는지 확인해주세요.
# 2-2 엑셀 파일 불러오기
df_excel = pd.read_excel('엑셀_파일명.xlsx', usecols="B",header=None)
# usecols는 엑셀 파일 내에서 어느 열의 데이터를 가져올지를 알려주는 매개변수입니다.
# 예시 코드에서는 B열에 변경하고 싶은 파일 이름 데이터가 있다고 알려주는 것입니다.
# header는 데이터의 첫 번째열부터 가져올지를 알려주는 매개변수 입니다.
# 예시 코드에서는 header(열 이름)이 없다고 설정하는 것입니다. 기본값은 header=0으로 제목이 있다고 상정합니다.
# 2-3 출력
# print(df_excel)
2)까지 실행한 후 df_excel을 출력하면 다음[그림 3]과 같은 결과가 나옵니다.
3) 이제 폴더 안에 있는 수정 전 파일 이름들을 가져옵니다.
이는 후에 파일 이름을 바꾸기 위해서는 수정 전의 파일 이름도 알고 있어야 하기 때문에 진행하는 과정입니다.
## 3. 수정 전 파일 이름 읽어오기 (수정 오름차순, 최근 것이 가장 밑에)
# 3-1 수정 전 파일의 이름들을 모두 가져오는 함수 만들기
def get_file_name():
# 바꾸려는 폴더의 경로 변수로 설정해주기
path = "C:/Users/Desktop/test"
# 폴더 내 파일들의 이름들을 리스트로 저장하기
files = os.listdir(path)
# 목적하는 내용에 맞게 리스트 수정하기
# 리스트에서 for문을 돌면서, 윈도우 운영체제를 위해 저장된 숨겨진 파일들을 걸러내는 작업입니다.
files = [i for i in files if os.path.isfile(os.path.join(path, i)) and i != "desktop.ini"]
# 리스트를 폴더에서 수정된 순으로 정렬하는 함수입니다.
files.sort(key=lambda x: os.path.getmtime(os.path.join(path, x)))
# 리스트를 리턴합니다.
return files
# 3-2 결과 출력
# print(get_file_name())
3)까지 실행한 후 리스트를 출력하면 다음[그림 4]과 같은 결과가 나옵니다.
이때 의도된 바와 같이 파일명이 아닌 수정된 순으로 결과가 출력됨을 알 수 있습니다.
4) 파일명을 엑셀 데이터로 변경합니다.
## 4. 파일 이름 변경하기
# 파일이 있는 폴더의 경로를 변수로 저장해줍니다
path = "C:/Users/Desktop/test"
# 이름이 변경된 파일이 저장될 폴더의 경로를 설정해줍니다.
os.chdir("C:/Users/Desktop/test")
## 4. 파일 이름 변경하기
# for문을 돌면서 0,1,2 식으로 i를 가져오는 이유는,엑셀의 몇번째 열 데이터를 읽을지 알려주기 위함입니다.
for i, name in enumerate(get_file_name()):
# 파일 이름과 파일의 확장자를 분리합니다.
file_name, file_extension = os.path.splitext(name)
# 수정 전 파일명의 경로를 가져오는 코드입니다.
src = os.path.join(path, str(name))
# 수정하고 싶은 파일명을 담은 변수를 저장합니다.
new_file_name = sum(df_excel.values.tolist(), [])[i] + file_extension
# 수정 후 파일명의 경로를 알려주는 코드입니다.
dst = os.path.join(path, str(new_file_name))
# 파일명을 변경합니다.
os.rename(str(src), str(new_file_name))
4-1) 응용: 4) 내용의 코드를 조금 수정하면, 원래 파일명 앞에 오늘 날짜와 같은 정해진 내용을 넣을 수 있습니다.
## 4. 파일 이름 변경하기
# 파일이 있는 폴더의 경로를 변수로 저장해줍니다
path = "C:/Users/Desktop/test"
# 이름이 변경된 파일이 저장될 폴더의 경로를 설정해줍니다.
os.chdir("C:/Users/Desktop/test")
## 응용: 기존 파일명을 유지하면서 앞에 특정 내용 넣기
# for문을 돌면서 0,1,2 식으로 i를 가져오는 이유는,엑셀의 몇번째 열 데이터를 읽을지 알려주기 위함입니다.
for i, name in enumerate(get_file_name()):
# 파일 이름과 파일의 확장자를 분리합니다.
file_name, file_extension = os.path.splitext(name)
# 수정 전 파일명의 경로를 가져오는 코드입니다.
src = os.path.join(path, str(name))
# (응용하여 수정된 코드)
new_file_name = sum(df_excel.values.tolist(), [])[i] + "_" + name + file_extension
# 수정 후 파일명의 경로를 알려주는 코드입니다.
dst = os.path.join(path, str(new_file_name))
# 파일명을 변경합니다.
os.rename(str(src), str(new_file_name))
마지막으로 주석이 없는 예시의 전체 코드입니다.
!pip install pandas
import pandas as pd
import os
os.chdir('C:/Users/Desktop')
df_excel = pd.read_excel('엑셀_파일명.xlsx', usecols="B",header=None)
def get_file_name():
path = "C:/Users/Desktop/test"
files = os.listdir(path)
files = [i for i in files if os.path.isfile(os.path.join(path, i)) and i != "desktop.ini"]
files.sort(key=lambda x: os.path.getmtime(os.path.join(path, x)))
return files
path = "C:/Users/Desktop/test"
os.chdir("C:/Users/Desktop/test")
for i, name in enumerate(get_file_name()):
file_name, file_extension = os.path.splitext(name)
src = os.path.join(path, str(name))
new_file_name = sum(df_excel.values.tolist(), [])[i] + file_extension
dst = os.path.join(path, str(new_file_name))
os.rename(str(src), str(new_file_name))
긴 글 읽어주셔서 감사합니다. 조금이나마 도움이 되었으면 좋겠습니다!
'Python > 업무 자동화' 카테고리의 다른 글
[파이썬+워드] 워드 속 이미지 자동 추출하기 (0) | 2024.11.02 |
---|---|
[파이썬+엑셀] 엑셀 빈 값(결측치)이 있는 파일 및 위치 찾기 (0) | 2024.10.30 |