본문 바로가기
컴퓨터 활용(한글, 오피스 등)/50_1. 운영체제_윈도우

파이썬으로 여러 엑셀파일의 데이터 읽어 들이기/pandas[출처] 파이썬으로 여러 엑셀파일의 데이터 읽어 들이기/pandas|작성자 장삼

by 3604 2024. 3. 27.
728x90

출처:https://blog.naver.com/jangsam24/221389859840

여러 디렉토리에 있는 엑셀파일에 접근하여 데이터 개수를 구하는 일이 생겼다.
그래서 한번 스크립트를 짜보았다.
우선 내가 구하려고 했던 것은 6번째 열의 "outstanding"의 개수를 세는 것이다.

 

한가지 문제점이 있는데 그 지정된 디렉토리안에 여러 엑셀파일이 있다고 가정하자. 예를 들어,
103_breakdown_20150727_v007.xlsx
103_breakdown_20150614_v001.xlsx
103_breakdown_20150622_v002.xlsx
여기서 읽어들여야 하는 파일은 v007 이다. 왜냐하면 버전번호가 가장 높기 때문이다.
엑셀 파일을 열어서 6번째 행을 지정하고 거기서 "outstanding"의 개수를 구하는 것인데 여러 디렉토리에 있는 경우를 생각해보자.
딕셔너리에 디렉토리 위치를 넣고 for구문으로 돌리면서 개수를 뽑아내도록 한다.
1) 여러 디렉토리가 있는 위치를 딕셔너리에 넣는다.
2) 마지막으로 결과물을 저장할 위치를 지정한다.
3) for구문으로 순환시키며 딕셔너리에 저장되어 있는 위치 주소를 뽑아낸다.
4) glob함수로 breakdown이란 글자가 들어간 엑셀 파일들을 추려낸다.
5) 그리고 파일명을 split('_')으로 분리하고 마지막 버전번호만 뽑아낸다.
6) 가장 큰 수를 max함수로 고르고 index함수로 위치를 찾아낸다.
7) 위치를 가지고 실제 파일을 찾는다.
8) 우리가 갯수를 세고자 하는 것은 "outstanding"인데 대문자로도 적혀 있을수가 있어서 
정규식 표현을 이용해 대소문자 구분을 하지 않고 찾아내는 설정을 한다.(re.IGNORECASE)
9) 판다스로 엑셀 파일을 읽는다.
10) iloc를 이용해 6번째 행을 뽑아내며 단어의 갯수를 추출한다.
11) 센 갯수를 합한다.
12) 이제 화수(episode)번호는 key, 합한 수는 value로 해서 딕셔너리를 만든다. 그 이유는 데이터 프레임을 만들때 들어가는 data를 만들기 위함이다.
13) 이제 여러 디렉토리에서 모아진 데이터를 딕셔너리에 모으고 그걸 판다스를 이용해 데이터 프레임을 만든다.
14) 결과값을 엑셀에 저장한다. 

 

 

import pandas as pd import os import glob import re file_path = {103: r'C:\Users\seon\PycharmProjects\untitled\venv', 104: r'C:\Users\seon\Downloads', } save_path = r'C:\Users\seon\PycharmProjects\untitled\venv\result.xlsx' result_out = {} for episode, path in file_path.items(): file_list = glob.glob(os.path.join(path, '*breakdown*')) version_list = [] for file in file_list: parse = file.split('_') num = parse[-1][1:4] version_list.append(int(num)) max_num = max(version_list) index_num = version_list.index(max_num) target_file = file_list[index_num] target_word = re.compile('outstanding', re.IGNORECASE) df = pd.read_excel(target_file) target_colums = df.iloc[:, 5].str.count(target_word) missing_count = int(target_colums.sum()) result_out[episode] = [missing_count] df = pd.DataFrame(data=result_out) print(df) df.to_excel(save_path, index=False)

 

728x90
반응형