'코'딩/Python

[업무 자동화+엑셀] 파이썬으로 엑셀 데이터를 가져와 파일 이름들을 한 번에 변경하기

금책코 2024. 9. 16. 18:50

안녕하세요!

 

이번에 공유하려는 코드는 인턴 다니던 시절 겪었던 업무를 자동화하려고, 구글링 하며 여러 분들의 코드를 참고하며 짰었던 것입니다.

  

이런 상황에 있는 분들에게 해당 코드가 도움이 될 것 같습니다. 

 

1. 파일 이름을 바꿔야 하는데, 파일이 너무 많은 경우  

2. 바꾸려는 파일 이름들이 엑셀 데이터로 저장되어 있는 경우  

 

파이썬을 사용하면 일일이 입력하면서 바꾸는 것보다 훨씬 빠르고 정확하게 할 수 있습니다.

코드 각 줄에 대한 설명이 없는 전체 코드는 제일 하단에 첨부하겠습니다.  

최종 코드 실행 영상은 [결과]와 같습니다.

[결과]

 

코드 내용도 간단하고, pdf, xlsx, word 등 여러 파일 형태가 섞여 있는 상황에도 관계없이 적용할 수 있으니, 예시를 보며 차례차례 진행해 보면 좋을 것 같습니다. 

먼저 바꾸려는 파일명이 담겨 있는 엑셀의 데이터[그림1]와 바꾸기 전 파일명이[그림2]이 다음과 같다고 가정해 봅시다.

 

[그림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. 수정 전 파일 이름 읽어오기 (수정 오름차순, 최근 것이 가장 밑에)

# 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) 파일명을 엑셀 데이터로 변경합니다.

## 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))

 

 

긴 글 읽어주셔서 감사합니다. 조금이나마 도움이 되었으면 좋겠습니다!