티스토리 뷰

반응형

0. 지난 1화, 3화,  4화를 통해, 좀 더 재미있는 예제 만들기

 

1화에서는 파이썬에서 Excel을 읽는 것을,  3화에서는 쓰는 것에 대해서 알아보았습니다. 엑셀에서 데이터를 읽고 써보았고, 4화에서는 폴더 내 파일을 검색해서 데이터프레임에 저장하는 방법에 대해서 알아보았습니다. 

 

그럼 이번에는 폴더 내에 있는 엑셀파일을 찾아서 하나로 합쳐 주는 방법에 대해서 알아볼까 합니다. 

이전의 포스트는 아래와 같이 링크를 넣어두었으니 궁금하신 분들은 참고하세요~

 

[1화 파이썬에서 엑셀(Excel) 데이터 불러오기, https://dataleader.tistory.com/20]

 

 

[파이썬(Python) 이야기 1화] 파이썬에서 엑셀(Excel) 데이터 불러오기

0. 파이썬에서 엑셀을 불러오기 위해서는 어떻게 해야할까? 데이터 분석을 하기위해서, 다양한 작업을 해야하지만, 그 중에서 자주 반복적으로 접하게 되는 부분이 엑셀을 불러오는 일입니다.

dataleader.tistory.com

 

[3화 파이썬에서 엑셀(Excel)에 데이터를 입력하기, https://dataleader.tistory.com/23]

 

 

[파이썬(Python) 이야기 3화] 파이썬에서 엑셀(Excel)에 데이터를 입력하기

0. 지난화에서 엑셀(Excel) 데이터를 판다스(pandas)를 통해서 읽어보았다~  그럼 쓰는건? 지난화에서는 pandas를 통해 read_excel 함수를 통해서, 엑셀에 있는 데이터를 읽어 보았습니다. 그렇다면, 쓰는

dataleader.tistory.com

 

[4화 폴더 내 파일 검색하기, 폴더 내 파일 정보 데이터 프레임으로 저장하기, https://dataleader.tistory.com/24]

 

[파이썬(python) 이야기 4화] 폴더 내 파일 검색하기, 폴더 내 파일 정보 데이터 프레임으로 저장하

0. 폴더 검색? 프로그램을 개발할 때 종종 폴더를 검색해 파일을 수정하는 경우가 발생합니다. 그러나 파일이 하나일 경우에는 크게 문제가 없지만, 파일이 여러 개일 경우 어떻게 해야할 까요?

dataleader.tistory.com

 

1. 폴더에 있는 엑셀을 하나로 합친다고?

 

 

제가 이 예제를 만들고자 했던 이유는 실제 회사에서 이러한 일들이 매우 반복된다는 것입니다. 실제 실무자급에서 이런일들이 반복되는데요~ 사실 단순반복되는 일이지만 파일이 많을 경우 여간 힘들게 하는게 아니죠? 특히 정확하게 처리해야할 경우에는 더더욱 그렇습니다. 

 

그런데 프로그램을 하나 만들어서 처리한다면 얼마나 편리할까요? 우리는 이미 이전 포스트를 통해 힌트를 얻었습니다. 이 프로그램들을 합치지 않았을 뿐입니다. 

 

물론, 처음부터 완벽하게 프로그램을 구성하지는 않을 것입니다. 즉 몇 가지 제한이 있을 것이고 이는 다음에 해결하려합니다. 그 이유는 모든 것을 다 한번에 해결하려 한다면 저도 여러분들도 힘들기 때문입니다.(코드가 복잡해져요~ ㅎㅎ)

 

자 그럼 문제를 제시하도록 하겠습니다. 아래 그림을 살펴보죠

 

왼쪽에는 test1, test2, test3 이라는 엑셀파일이 있습니다. 이 엑셀파일은 오른쪽과 같이 동일한 형식으로 성적정보가 입력되어 있습니다. 

 

이 정보를 test1에 합쳐볼 것입니다. 

 

 

[소스코드, 폴더에 파일 검색하기]

 

4화에서 사용했던 코드를 그대로 가져왔습니다. 

import pandas
import os

dir = 'C:/Users/Desktop/PyProject/blog5'
files = os.listdir(dir)
global dataframeFile  # 데이터프레임의 전역화

# 데이터프레임초기화
dataframeFile = pandas.DataFrame(index=range(0, 0), columns=['파일명', '이름', '확장자', '위치정보'])

# [파일검색 함수] : 재귀호출을 디렉토리에 있는 모든 파일을 데이터프레임형식으로 전달하는 함수
def file_search(dir, dataframeFile):
    files = os.listdir(dir)
    for file in files:
        fullname_file = os.path.join(dir, file)
        if os.path.isdir(fullname_file):
            dataframeFile = file_search(fullname_file, dataframeFile)  # 재귀함수 호출
        else:
            name, ext = os.path.splitext(file)
            dic_file = {'파일명': file, '이름': name, '확장자': ext, '위치정보': fullname_file}
            dataframeFile = dataframeFile.append(dic_file, ignore_index=True)
    # 데이터프레임 리턴
    return dataframeFile

# 재귀함수 호출
dataframeFile = file_search(dir, dataframeFile)
# 데이터프레임 결과출력
print(dataframeFile)

자 이제 dataframeFile에는 이렇게 저장되어 있습니다. 

 

 

자 이제 데이터프레임 dataframeFile에서 확장자가 xlsx인 녀석을 위치정보에서 읽어와서 하나라 합쳐주면됩니다. 오늘 학습의 가장 핵심이기도 하죠~

 

아래의 코드를 사용하면 xldataframe에 확장자가 .xlsx 인 파일만 추출할 수 있삽니다. 

 

결과데이터프레임 = 데이터프레임.where(데이터프리임[항목명] =='해당명칭') 이렇게 하면 됩니다. 

xldataframe = dataframeFile.where(dataframeFile['확장자']=='.xlsx')
print(xldataframe)

결과가 잘 나왔나요?

 

2. 파일 합치기?

파일을 합쳐보도록 하겠습니다. 우선 파일에 있는 값들을 하나씩 읽어오는 코드를 작성해 보겠습니다. 

 

[소스코드, 데이터프레임 합치기]

for i in range(0, len(xldataframe.index)):
    XlsxData_dataframe = pandas.read_excel(xldataframe.iloc[i].loc['위치정보'], sheet_name="Sheet1")
    print(XlsxData_dataframe)

잘 읽어와 지는 것을 확을 할 수 있습니다. 3개의 파일이 모두 읽혀 왔습니다. 자 그러면 이 크고들 수정을 해보도록 하겠습니다. 그래서 하나의 데이터프레임에 합칠께요~

 

for i in range(0, len(xldataframe.index)):
    if i==0:
        XlsxData_dataframe = pandas.read_excel(xldataframe.iloc[i].loc['위치정보'], sheet_name="Sheet1")
        total_dataframe = XlsxData_dataframe
    else:
        XlsxData_dataframe = pandas.read_excel(xldataframe.iloc[i].loc['위치정보'], sheet_name="Sheet1")
        total_dataframe = total_dataframe.append(XlsxData_dataframe, ignore_index = True)

print(total_dataframe)

짜잔 ~ 결과가 잘 나타났나요? 자 이제 마지막으로 결과를 엑셀에 출력해보도록 하겠습니다. 

 

3. 결과 엑셀에 출력하기

자 그럼 엑셀파일을 생성해서 출력해 보도록 하겠습니다. 저는 result.xlsx 파일을 생성해서 total_dataframe에 대한 결과를 출력하려합니다. 

 

[주의사항]

지난번에도 언급을 했지만 반드시 xlsxwriter을 설치해 주어야만 합니다. 코드는 아래와 같이 작성하였습니다. 

 

[소스코드, 엑셀에 결과출력하기]

writer = pandas.ExcelWriter('C:/Users/Desktop/PyProject/blog5/result.xlsx', engine = 'xlsxwriter')

total_dataframe.to_excel(writer, sheet_name = 'Sheet1')
writer.save()

print("완료")

 

 

짜잔 결과가 합쳐진 것을 확인할 수 있습니다. 

 

[최종 소스코드]

 

import pandas
import os

dir = 'C:/Users/Desktop/PyProject/blog5'
files = os.listdir(dir)
global dataframeFile  # 데이터프레임의 전역화

# 데이터프레임초기화
dataframeFile = pandas.DataFrame(index=range(0, 0), columns=['파일명', '이름', '확장자', '위치정보'])

# [파일검색 함수] : 재귀호출을 디렉토리에 있는 모든 파일을 데이터프레임형식으로 전달하는 함수
def file_search(dir, dataframeFile):
    files = os.listdir(dir)
    for file in files:
        fullname_file = os.path.join(dir, file)
        if os.path.isdir(fullname_file):
            dataframeFile = file_search(fullname_file, dataframeFile)  # 재귀함수 호출
        else:
            name, ext = os.path.splitext(file)
            dic_file = {'파일명': file, '이름': name, '확장자': ext, '위치정보': fullname_file}
            dataframeFile = dataframeFile.append(dic_file, ignore_index=True)
    # 데이터프레임 리턴
    return dataframeFile

# 재귀함수 호출
dataframeFile = file_search(dir, dataframeFile)
# 데이터프레임 결과출력
print(dataframeFile)

xldataframe = dataframeFile.where(dataframeFile['확장자']=='.xlsx')
print(xldataframe)

for i in range(0, len(xldataframe.index)):
    if i==0:
        XlsxData_dataframe = pandas.read_excel(xldataframe.iloc[i].loc['위치정보'], sheet_name="Sheet1")
        total_dataframe = XlsxData_dataframe
    else:
        XlsxData_dataframe = pandas.read_excel(xldataframe.iloc[i].loc['위치정보'], sheet_name="Sheet1")
        total_dataframe = total_dataframe.append(XlsxData_dataframe, ignore_index = True)

print(total_dataframe)

writer = pandas.ExcelWriter('C:/Users/Desktop/PyProject/blog5/result.xlsx', engine = 'xlsxwriter')

total_dataframe.to_excel(writer, sheet_name = 'Sheet1')
writer.save()

print("완료")

 

4. 맺음말

이번 포스트에서는 이전 포스트들의 코들를 활용하여 하나에 엑셀에 여러파일을 합쳐주는 것을 해보았습니다. 오랜만에 파이썬 코드를 만져보니 새록새록 하네요. 요새 게을러져서 하나하나 정리하는것도 좀처럼 쉽지 않습니다. 제가 힘낼수 있도록 여러분들의 많은 관심 부탁드립니다. 

 

여러분의 구독과 좋아요는 포스트를 작성하는데 많은 도움이 됩니다. 

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함