상세 컨텐츠

본문 제목

파이썬 엑셀 파일 빠르게 읽는 방법(dask, csv, xlsx)

IT/Python

by 조대리 2022. 11. 3. 12:00

본문

반응형

 

 

빅데이터를 분석한다거나, 파이썬으로 활용하는 과정에서 엑셀 파일을 데이터프레임 형식으로 가져와야 하는 일이 생긴다.

 

이때 엑셀 파일의 용량이 크거나, 파일의 수가 많을 경우 데이터를 가져오는데 시간이 꽤 많이 소요된다.

 

한 번만 처리를 해야 하면 기다릴 수도 있겠지만... 나의 경우는 일주일 간격으로 크롤링을 해서 데이터를 엑셀 파일로 만들어놓았고, 이용자가 접속할 때마다 파일들을 확인하도록 프로그램을 설계해놨으며 매번 이 데이터들을 통해 원하는 정보만 뽑아내도록 프로그램을 만들었다. 그렇기에 어떻게든 속도를 빠르게 해야만 했다. (혹여나 더 좋은 방법이 있다면 조언 부탁드립니다ㅎㅎ)

 

이 과정에서 많은 엑셀 파일을 조회해야 했는데, 시도해 본 방법을 포스팅해 보려 한다.

 

확장자에 따른 처리 속도와 dask를 사용해 '데이터를 불러올 때도 병렬 처리를 통해 좀 더 빨라지지 않을까?' 생각하여 시도해 보았다.

 

1. .xlsx 확장자 파일을 읽는다.

2. .csv 확장자 파일을 읽는다.

3. dask 모듈을 이용해 .xlsx 확장자 파일을 읽는다.

4. dask 모듈을 이용해 .csv 확장자 파일을 읽는다.

 

dask(다스크) 모듈은 파이썬에서 분산 병렬 컴퓨팅을 하기 위한 라이브러리다. 자체 작업 스케줄링 시스템이 있고 넘파이(NumPy), 판다스(pandas) 등 파이썬 데이터 프레임워크를 인식하며 단일 머신에서 다수의 머신으로 확장이 가능하다.

 

 

 

 

 

dask에 대해 더 알고 싶다면 홈페이지를 참고하길 바란다.(비슷한 것으론 '레이 Ray'가 있다고 한다.)

https://dask.org/

 

 

실험 전 파일 불러오기 (csv, xlsx 확장자 파일 불러오며 구분하기)

 

먼저 os 모듈을 통해 엑셀 파일(데이터)가 있는 경로를 가져온다. 'os.getcwd()'

 

그 후 폴더 안에 있는 파일 목록을 'os.listdir()'을 통해 'file_list' 함수에 넣었다.

 

import os

path_dir = os.getcwd() + '\\excel_files\\'

---   ---   ---   ---

path_dir
'd:\\파일 경로\\excel_files\\'
file_list = os.listdir(path_dir)

---   ---   ---   ---

file_list
['2021.01.12.csv',
 '2021.01.12.xlsx',
 '2021.01.29.csv',
 '2021.01.29.xlsx',
 '2021.02.05.csv',
 '2021.02.05.xlsx',
 '2021.02.22.csv',
 '2021.02.22.xlsx',
 '2021.03.03.csv',
 '2021.03.03.xlsx',
 '2021.03.16.csv',
 '2021.03.16.xlsx',
 '2021.03.24.csv',
 '2021.03.24.xlsx',
 '2021.04.01.csv',
 '2021.04.01.xlsx',
 '2021.04.08.csv',
 '2021.04.08.xlsx',
 '2021.04.19.csv',
 '2021.04.19.xlsx',
 '2021.04.22.csv',
 '2021.04.22.xlsx',]

 

 

그 후 비교를 위해 '.csv' 와 '.xlsx' 파일을 확장자에 따라 분류하였다.

 

csv_list = [csv for csv in file_list if csv.endswith(".csv")]

csv_list
['2021.01.12.csv',
 '2021.01.29.csv',
 '2021.02.05.csv',
 '2021.02.22.csv',
 '2021.03.03.csv',
 '2021.03.16.csv',
 '2021.03.24.csv',
 '2021.04.01.csv',
 '2021.04.08.csv',
 '2021.04.19.csv',
 '2021.04.22.csv']
 
 ---   ---   ---   ---

excel_list = [excel for excel in file_list if excel.endswith(".xlsx")]

excel_list
['2021.01.12.xlsx',
 '2021.01.29.xlsx',
 '2021.02.05.xlsx',
 '2021.02.22.xlsx',
 '2021.03.03.xlsx',
 '2021.03.16.xlsx',
 '2021.03.24.xlsx',
 '2021.04.01.xlsx',
 '2021.04.08.xlsx',
 '2021.04.19.xlsx',
 '2021.04.22.xlsx']

 

 

1. .xlsx 확장자 파일 읽기

 

먼저 엑셀 확장자인 '.xlsx' 파일부터 시도했다. 시간이 6.63~7.11 정도로 소요되었다.

 

파일 하나당 2MB 정도 되는 것을 생각했을 때 매우 느리다... ㅜㅜ

 

import time
import pandas as pd


for excel_name in excel_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + excel_name)

    testdf = pd.read_excel(path_dir + excel_name)
    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간
    
 ---   ---   ---   ---    
    
d:\파일경로\excel_files\2021.01.12.xlsx
time : 6.86955189704895
d:\파일경로\excel_files\2021.01.29.xlsx
time : 6.8885581493377686
d:\파일경로\excel_files\2021.02.05.xlsx
time : 6.914562463760376
d:\파일경로\excel_files\2021.02.22.xlsx
time : 6.635499000549316
d:\파일경로\excel_files\2021.03.03.xlsx
time : 6.867197751998901
d:\파일경로\excel_files\2021.03.16.xlsx
time : 7.048592805862427
d:\파일경로\excel_files\2021.03.24.xlsx
time : 6.948570013046265
d:\파일경로\excel_files\2021.04.01.xlsx
time : 7.012584686279297
d:\파일경로\excel_files\2021.04.08.xlsx
time : 7.022587537765503
d:\파일경로\excel_files\2021.04.19.xlsx
time : 7.113607406616211
d:\파일경로\excel_files\2021.04.22.xlsx
time : 7.025587797164917

 

 

2. .csv 확장자 파일 읽기

 

.csv 확장자로 된 파일을 처리할 땐, 0.074~0.085로 무려 100배나 처리가 빨라진 것을 알 수 있다.

 

for csv_name in csv_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + csv_name)

    testdf2 = pd.read_csv(path_dir + csv_name, encoding='CP949')
    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간
    
 ---   ---   ---   ---        
 
d:\파일경로\excel_files\2021.01.12.csv
time : 0.07701706886291504
d:\파일경로\excel_files\2021.01.29.csv
time : 0.0850210189819336
d:\파일경로\excel_files\2021.02.05.csv
time : 0.08301901817321777
d:\파일경로\excel_files\2021.02.22.csv
time : 0.07601714134216309
d:\파일경로\excel_files\2021.03.03.csv
time : 0.07701706886291504
d:\파일경로\excel_files\2021.03.16.csv
time : 0.07501745223999023
d:\파일경로\excel_files\2021.03.24.csv
time : 0.07701802253723145
d:\파일경로\excel_files\2021.04.01.csv
time : 0.07401680946350098
d:\파일경로\excel_files\2021.04.08.csv
time : 0.07501745223999023
d:\파일경로\excel_files\2021.04.19.csv
time : 0.08101820945739746
d:\파일경로\excel_files\2021.04.22.csv
time : 0.07601761817932129

 

 

3. dask 모듈을 이용해 .xlsx 확장자 파일 읽기

 

이번에는 dask를 이용해서 '.xlsx' 확장자 파일을 처리해 보겠다. 6.42~7.46으로 변동이 무의미한 처리 속도가 나왔다.

 

import pandas as pd
import dask
import dask.dataframe as dd
from dask.delayed import delayed


for excel_name in excel_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + excel_name)
    excel_file = path_dir + excel_name

    parts = dask.delayed(pd.read_excel)(excel_file, sheet_name=0)
    output_dataframe = dd.from_delayed(parts)

    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간

---   ---   ---   ---

d:\파일경로\excel_files\2021.01.12.xlsx
time : 7.465013027191162
d:\파일경로\excel_files\2021.01.29.xlsx
time : 6.861083030700684
d:\파일경로\excel_files\2021.02.05.xlsx
time : 6.94910740852356
d:\파일경로\excel_files\2021.02.22.xlsx
time : 6.426518440246582
d:\파일경로\excel_files\2021.03.03.xlsx
time : 7.012065649032593
d:\파일경로\excel_files\2021.03.16.xlsx
time : 7.017169237136841
d:\파일경로\excel_files\2021.03.24.xlsx
time : 7.040522813796997
d:\파일경로\excel_files\2021.04.01.xlsx
time : 7.152569770812988
d:\파일경로\excel_files\2021.04.08.xlsx
time : 7.092149972915649
d:\파일경로\excel_files\2021.04.19.xlsx
time : 6.9599103927612305
d:\파일경로\excel_files\2021.04.22.xlsx
time : 7.004428863525391

 

 

4. dask 모듈을 이용해 .csv 확장자 파일 읽기

 

이번에는 dask를 이용해서 '.csv' 확장자 파일을 처리해 보겠다.

 

dask를 사용하지 않았을 때 0.074~0.085였던 것이 0.017~0.019으로 4배가량 더 빠르게 처리된 것을 알 수 있다.

 

import time
import dask.dataframe as dd


for csv_name in csv_list:
    start = time.time() # 코드 시작 시간 저장
    print(path_dir + csv_name)

    testdf = dd.read_csv(path_dir + csv_name, encoding='CP949')
    print("time :", time.time() - start)  # 현재시각 - 시작시간 = 실행 시간
    
---   ---   ---   ---

d:\파일경로\excel_files\2021.01.12.csv
time : 0.019544601440429688
d:\파일경로\excel_files\2021.01.29.csv
time : 0.018564224243164062
d:\파일경로\excel_files\2021.02.05.csv
time : 0.019542694091796875
d:\파일경로\excel_files\2021.02.22.csv
time : 0.019544124603271484
d:\파일경로\excel_files\2021.03.03.csv
time : 0.018566608428955078
d:\파일경로\excel_files\2021.03.16.csv
time : 0.019541501998901367
d:\파일경로\excel_files\2021.03.24.csv
time : 0.01856541633605957
d:\파일경로\excel_files\2021.04.05.csv
time : 0.018565654754638672
d:\파일경로\excel_files\2021.04.08.csv
time : 0.018566608428955078
d:\파일경로\excel_files\2021.04.19.csv
time : 0.017589092254638672
d:\파일경로\excel_files\2021.04.22.csv
time : 0.019542217254638672
d:\파일경로\excel_files\2021.04.28.csv
time : 0.01856684684753418
d:\파일경로\excel_files\2021.05.11.csv
time : 0.021496057510375977

 

 

결론

 

결론은 '.xlsx' 확장자보다는 '.csv'를 사용하는 것이 처리 속도 향상에 도움이 된다는 점이다.

 

머신러닝, 딥러닝을 하기 위해선 굉장히 많은 데이터를 요구하는데, 대용량 데이터를 처리하게 된다면 병렬처리를 할 수 있는 dask를 사용할 때 금상첨화가 될 것이다.

 

 

같이 보면 좋은 글 - 판다스(Pandas) 명령어, 기능 모음

 

판다스(Pandas) 명령어, 기능 모음

판다스(Pandas)는 데이터 조작 및 분석, 수집, 전처리를 위한 다양한 편의 기능을 지원하며 Python 프로그래밍 언어용으로 작성된 소프트웨어 라이브러리입니다. ​ 넘파이(Numpy)를 확장해서 만든 것

chostock.com

 

반응형

관련글 더보기