본문 바로가기
  • 안녕하세요! 금융, 책, 코딩을 기록합니다
Python/업무 자동화

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

by 금책코 2024. 9. 16.

안녕하세요!

 

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

  

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

 

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

 

 

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