관리 메뉴

솜씨좋은장씨

[Python] 여러 개의 엑셀파일 하나로 합치는 방법! ( feat. pandas ) 본문

Programming/Python

[Python] 여러 개의 엑셀파일 하나로 합치는 방법! ( feat. pandas )

솜씨좋은장씨 2021. 12. 30. 20:38
728x90
반응형

오늘 친구의 부탁으로 날짜별 특정 키워드에 대한 네이버 뉴스 크롤링을 진행하였는데

각 날짜별로 만들어진 이 모든 엑셀 파일을 하나의 엑셀로 만들어서 전달해야하여  pandas를 활용해서 작업해보았습니다.

 

추후 또 사용할 일이 있을 것 같아 적어보려 합니다. ( 전체 코드는 맨 마지막에 있습니다. )

1. 병합을 원하는 엑셀파일 목록 가져오기

1-1. os.listdir을 이용하는 방법

import os

file_format = "파일 포맷(확장자)" # .csv .xlsx
file_path = "파일 경로"
file_list = [f"{file_format}/{file}" for file in os.listdir(file_path) if file_format in file]

위의 사진의 엑셀 파일을 예시로 들면 아래와 같습니다.

import os

file_format = ".xlsx" # .csv
file_path = "/Users/donghyunjang/PythonHome/naver_news_article/당근마켓"
file_list = [f"{file_path}/{file}" for file in os.listdir(file_path) if file_format in file]

1-2. glob.glob을 이용하는 방법

import glob

file_format = "파일 포맷(확장자)" # .csv .xlsx
file_path = "파일 경로"
file_list = glob.glob(f"{file_path}/*{file_format}")

위의 사진의 엑셀 파일을 예시로 들면 아래와 같습니다.

import glob

file_format = ".xlsx" # .csv
file_path = "/Users/donghyunjang/PythonHome/naver_news_article/당근마켓"
file_list = glob.glob(f"{file_path}/*{file_format}")

1-3. 위의 두 방법을 활용하여도 되고 본인이 직접 list로 작성하여도 됩니다.

file_list = ["file01.xlsx", "file02.xlsx", "file03.xlsx"]

2. Pandas를 활용하여 엑셀 파일 합치는 방법

2-1. Pandas 라이브러리 설치 및 import 

엑셀 파일을 읽고 쓰는데에는 pandas 라이브러리를 활용합니다.

이에 pandas 라이브러리를 설치하고 이를 import 시켜줍니다.

$ pip install pandas
import pandas as pd

여기서 as pd는 앞으로 pandas를 활용할때 pd로 줄여서 사용하겠다는 뜻입니다.

2-2. 합병한 결과를 담을 pandas DataFrame 객체 생성하기

merge_df = pd.DataFrame()

2-3. pandas로 파일을 읽고 병합에 활용할 column 설정하여 조금 전 생성한 DataFrame에 이어 붙이기

2-3-1. 파일 읽어오기 ( .xlsx 의 경우 / .csv 의 경우 )

첫번째 단계에서 만들어둔 파일 목록에서 하나씩 파일을 가져와 pandas로 읽어 DataFrame 형식으로 만들어줍니다.

.xlsx 파일의 경우

for file_name in file_list:
    file_df = pd.read_excel(file_name)

.csv 파일의 경우

for file_name in file_list:
    file_df = pd.read_csv(file_name, encoding='utf-8') 
    # encoding 기본은 utf-8 / 오류 발생 시 해당 파일에 맞는 인코딩으로 바꾸어야 함
    # 한국어 문서는 euc-kr 또는 cp949 일 수 도 있음

2-3-2. 병합을 희망하는 column 설정

모든 column을 활용하는 경우

columns = list(file_df.columns)

column 중 일부만 병합에 사용하려는 경우 ( 직접 원하는 column 리스트로 작성 )

columns = ["column1", "column2"]

위의 두 방법 중 하나를 선택하여 목록을 작성하고 

temp_df = pd.DataFrame(file_df, columns=columns)

읽어온 파일에서 해당 column만 남겨 temp_df 에 저장합니다.

2-3-3. 맨 처음 생성해 둔 merge_df에 이어 붙이기

merge_df = merge_df.append(temp_df, ignore_index=False) # ingnore_index = 기존 1, 2, 3, 4 번호 무시

3. 원하는 형식 ( csv 또는 xlsx ) 로 저장하기

이제 저장만 하면 끝입니다.

.csv 로 저장하고 싶은 경우

merge_df.to_csv("병합파일.csv, index=False)

.xlsx로 저장하고 싶은 경우

merge_df.to_excel("병합파일.xlsx", index=False)

👨🏻‍💻 전체 코드

import pandas as pd
import glob

def merge_excel_files(file_path, file_format, save_path, save_format, columns=None):
    merge_df = pd.DataFrame()
    file_list = file_list = [f"{file_path}/{file}" for file in os.listdir(file_path) if file_format in file]
    
    for file in file_list:
        if file_format == ".xlsx":
            file_df = pd.read_excel(file)
        else:
            file_df = pd.read_csv(file)
        
        if columns is None:
            columns = file_df.columns
            
        temp_df = pd.DataFrame(file_df, columns=columns)
        
        merge_df = merge_df.append(temp_df)
        
    if save_format == ".xlsx":
        merge_df.to_excel(save_path, index=False)
    else:
        merge_df.to_csv(save_path, index=False)
        

if __name__ == "__main__":
    merge_excel_files(file_path="/Users/donghyunjang/PythonHome/naver_news_article/당근마켓", file_format=".xlsx", 
                      save_path="/Users/donghyunjang/PythonHome/naver_news_article/당근마켓/20211201~20211229_당근마켓_네이버_기사.xlsx", save_format=".xlsx")

읽어주셔서 감사합니다.

Comments