에코프로.AI

[Python] 동일 폴더의 Excel 파일 모두 합치기 본문

AI Tutorial

[Python] 동일 폴더의 Excel 파일 모두 합치기

AI_HitchHiker 2024. 10. 16. 18:07

DALL-E 에서 생성된 이미지 입니다.

 

데이터 분석관련 - 동일한 데이터가 년별,월별,일별 로 엑셀파일이 나눠져 있는 경우,

하나의 파일로 합치는 작업관련하여, 파이썬 코드를 만들었습니다.

 

라이브러리 임포트
import os
import pandas as pd

 

기본경로 설정
path_dateset = 'G:/내 드라이브/DataSet/'

 

확장자 가져오기 (Ex) .csv, .xlsx
- 2개의 확장자(csv, xlsx) 별로 파이썬 호출 함수가 달라서, 구분관련하여 확장자를 가져오는 함수 구현
def extract_extension(file_path):
    _, file_extension = os.path.splitext(file_path)
    return file_extension
extract_extension('G:/내 드라이브/DataSet/서울특별시 공공자전거 이용정보(일별)/서울특별시 공공자전거 이용정보(일별)_2406.csv')

 

'.csv'

 

파일명 가져오기
- path에서 파일명을 가져오는 함수
def extract_filename(file_path):
    file_name = os.path.basename(file_path)
    filename_without_extension, _ = os.path.splitext(file_name)
    return filename_without_extension
extract_filename('G:/내 드라이브/DataSet/서울특별시 공공자전거 이용정보(일별)/서울특별시 공공자전거 이용정보(일별)_2406.csv')
'서울특별시 공공자전거 이용정보(일별)_2406'

 

파일 읽기
- 'utf-8'로 불러오다가 오류 발생 시, 'cp949'인코딩으로 다시한번 불러오도록 예외처리!
def read_file(file_path):
    extension = extract_extension(file_path)
   
    if ".xlsx" == extension:
        return pd.read_excel(file_path)
    if ".csv" == extension:
        try:
            return pd.read_csv(file_path, encoding='utf-8')
        except BaseException as e:
            return pd.read_csv(file_path, encoding='cp949')

 

특정 폴더의 csx, xlsx 파일들 확인
- 파일별 - 컬럼명, 데이터개수 확인관련 
def check_file(path_dateset, path_sub):
    path = path_dateset + path_sub
    
    #파일 경로명 변경
    file_list = os.listdir(path)
    file_lists = [file for file in file_list if file.endswith((".csv", ".xlsx"))]
    excel = pd.DataFrame()
    
    print('path : ', path)
    
    for _, file in enumerate(file_lists):
        try:
            df = read_file(path + file)
                
            print('==============================================================')
            print(extract_extension(file) + ', ' + file + ', ' + str(len(df)))
            print(list(df.columns))
            print(list(df.iloc[1]))
        except:
            print('- Err : ', file)

 

특정 폴더의 csx, xlsx 파일들 합치기
- 저장 시, 인코딩을  cp949로 하니깐 대용량 파일 불러올때 오래걸림. "utf-8"로 변경
# new_filename = '저장파일이름'
# columns = '저장할 컬럼 리스트
def merge_file(path_dateset, path_sub, new_filename = 'merge', columns = ""):
    path = path_dateset + path_sub
    
    #파일 경로명 변경
    file_list = os.listdir(path)
    file_lists = [file for file in file_list if file.endswith((".csv", ".xlsx"))]
    excel = pd.DataFrame()
    
    print('path : ', path)
    
    for i, file in enumerate(file_lists):
        df = read_file(path + file)
        
        if (i > 0):
            if columns == "":
                df = df.iloc[1:]
            else:
                df = df.iloc[1:][columns]
        else:
            if columns == "":
                df = df
            else:
                df = df[columns]

        # excel = excel.append(df , ignore_index=True) #파일 하나에 다른 파일 추가하기(파일 합치기)
        excel = pd.concat([excel, df], ignore_index=True)
        
        print('==============================================================')
        print(extract_extension(file) + ', ' + file + ', ' + str(len(df)))
        print(list(df.columns))

    # excel.to_csv(path+'merge.csv',index=False,encoding='euc-kr')
    # excel.to_csv(path + new_filename + '.csv', index=False, encoding='cp949')
    excel.to_csv(path + new_filename + '.csv', index=False, encoding='utf-8')

 


서울특별시 공공자전거 이용정보(일별)

- check_file 함수를 호출하여, '서울특별시 공공자전거 이용정보(일별)/' 폴더안의 엑셀파일들의

  컬럼이 모두 동일 한지, 데이터 포맷이 동일한지 확인

path_sub = '서울특별시 공공자전거 이용정보(일별)/'
check_file(path_dateset, path_sub)

 

- merge_file 함수를 호출하여, '서울특별시 공공자전거 이용정보(일별).csv' 의 파일명으로 병합된 엑셀파일을 생성

merge_file(path_dateset, path_sub, '서울특별시 공공자전거 이용정보(일별)', '')

 

 

 

끝~