프로그래밍 언어/Python

1분기 3개의 카드 명세서 하나로 취합하기

· 코딩마이데이

'ch_02/input' 폴더에 있는 5개의 카드 명세서 파일 '2024년1월.xlsx', '2024년2월.xlsx', '2024년3월.xlsx'를 하나로 취합해 봅시다.

비주얼 스튜디오 코드에서 새로운 파일을 생성하고, 파일명을 'step_2_2.py'로 변경합니다. 다음과 같이 코드를 작성한 뒤, 대화형 창에서 실행하면 액셀 파일로 저장된 3개의 카드 명세서가 하나의 리스트로 출력됩니다.

from pathlib import Path
import pandas as pd
from step_1 import IN_DIR, OUT_DIR # 이전에 작성한 모듈을 불러옵니다.

result = [] # 5
for xlsx_path in Path(IN_DIR).glob("2024년*월.xlsx"): # 6
    df_raw = pd.read_excel(xlsx_path, sheet_name="Sheet1", # 7
                           usecols="B:E", skiprows=2) # 8
    result.append(df_raw) # 9
result

 

05 비어 있는 리스트를 셍성합니다.

06 IN_DIR 경로에서 파일명이 '2024년*월.xlsx'인 액셀 파일을 불러오고, 8~9행을 반복합니다.

07 read_excel() 함수를 사용하여 xlsx_path 경로에 있는 액셀 파일의 'Sheet1'  시트를 데이터프레임으로 변환합니다.

08 result 리스트에 불러온 데이터프레임을 추가합니다.

09 변수 result를 대화형 창에서 실행해 저장된 값을 화면에 출력합니다.

 

액셀 파일로 취합

리스트 result에는 '2024년1월.xlsx', '2024년2월.xlsx', '2024년3월.xlsx'에서 읽어 온 3개의 데이터프레임이 들어 있습니다. 함수 concat()를 사용하여 3개의 데이터프레임을 하나로 합쳐 봅시다.

앞서 작성한 코드에서 이어서 다음 코드를 작성합니다. 이때 코드가 for 반복문 안에 입력되도록 들여쓰세요. 대화형 창에서 실행하면 실행 결과가 'output' 폴더에 액셀 파일로 생성됩니다.

 

from pathlib import Path
import pandas as pd
from step_1 import IN_DIR, OUT_DIR # 이전에 작성한 모듈을 불러옵니다.

result = [] # 05
for xlsx_path in Path(IN_DIR).glob("2024년*월.xlsx"): # 6
    df_raw = pd.read_excel(xlsx_path, sheet_name="Sheet1", # 7
                           usecols="B:E", skiprows=2) # 8
    result.append(df_raw) # 9

    df_concat = pd.concat(result) # 11
    df_concat.to_excel(OUT_DIR / f"{Path(__file__).stem}.xlsx", index=False) # 12

 

실행결과

 

12 함수 concat()를 사용하여 리스트 result에 저장된 3개의 데이터프레임을 하나로 결합합니다.

13 함수 to_excel()를 사용하여 df_concat 변수에 저장된 데이터프레임을 OUT_DIR 경로에 'step_2_2.xlsx' 파일로 저장합니다.

 

소스 코드 정리

from pathlib import Path
import pandas as pd
from step_1 import IN_DIR, OUT_DIR # 이전에 작성한 모듈을 불러옵니다.

OUT_2_2 = OUT_DIR / f"{Path(__file__).stem}.xlsx"

if __name__ == "__main__":
    result = [] # 05
    for xlsx_path in Path(IN_DIR).glob("2024년*월.xlsx"): # 6
        df_raw = pd.read_excel(xlsx_path, sheet_name="Sheet1", # 7
                            usecols="B:E", skiprows=2) # 8
        result.append(df_raw) # 9

    df_concat = pd.concat(result) # 11
    df_concat.to_excel(OUT_DIR / f"{Path(__file__).stem}.xlsx", index=False) # 12