tqdm으로 진행률 출력 (+pandas, tkinter, pyinstaller)

뀨뀨찬찬·2021년 4월 10일
0

부탁을 받아 간단한 프로그램을 만들었다.

"이거 한번에 엑셀로 합쳐주는 프로그램 좀 만들어줘 ㅠㅠ"

농담으로 한 말이었지만 들으면서 할 수 있을 것 같다는 생각이 들어서 만들어봤다.


import pandas as pd
import mmap
from tkinter import *
from tkinter import filedialog
from tqdm import tqdm


def get_num_lines(file_name):
   fp = open(file_name, "r+")
   buf = mmap.mmap(fp.fileno(), 0)
   lines = 0
   while buf.readline():
       lines += 1
   return lines


if __name__ == "__main__":
   root = Tk()
   root.withdraw()
   root.filenames = filedialog.askopenfilenames()
   l = []

   for file in tqdm(root.filenames, desc="전체 진행률", position=0, leave=True):
       f = open(file, 'r')
       if not f:
           print("cannot open " + file)
           continue
       # print("reading : " + file)
       for line in tqdm(f, total=get_num_lines(file), desc=file, position=0, leave=True):
           row = line.split()
           l.append(row)
       # print("done : " + file)
       f.close()

   df = pd.DataFrame(l)
   writer = pd.ExcelWriter("Total.xlsx", options={'strings_to_url': False})
   df.to_excel(writer, index=False)
   writer.close()

   print("complete writing to excel")

tkinter

tkinter의 filedialog.askopenfilenames()를 통해 파일 선택 다이얼로그를 띄운다.
(여러 창을 선택하려면 askopenfilenames()를 사용!! askopenfilename()은 파일 1개만 선택 가능!!)

또 print로 읽기를 진행 중인 파일을 찍는 것이 멋이 없어 보여 tqdm을 사용해 진행률을 출력했다.

pandas

선택한 파일을 하나씩 열고, 거기에서 한 줄씩 읽어들여 리스트에 append한다.
완성된 리스트를 DataFrame으로 만들고 ExcelWriter와 to_excel 함수로 엑셀로 출력시킨다.
strings_to_url 를 False로 해서 url이 포함되어 있어도 저장할 수 있다.
ExcelWriter로 DataFrame을 Excel 형식으로 만들고, 이걸 to_excel을 통해서 진짜 Excel로 만드는 것 같다.

tqdm

파이썬에 많이 익숙하진 않아도 앞선 tkinter나 pandas는 한번씩 써봤는데, tqdm은 처음 써봤다.
반복문에서 현재 진행률을 눈으로 볼 수 있게 표시해준다.
기본적으로 tqdm은 iterable-based 인데,

iterable-based
어떤 iterable이든 tqdm()으로 감쌀 수 있다.
tqdm(100), tqdm([]), 등, iterable 증가에 따라 진행률 증가

또 option을 parameter로 넣어줄 수 있다.

iterable : 반복자 객체
desc : 진행바 앞에 텍스트 출력
total : int, 전체 반복량
leave : bool, default로 True. (진행상태 잔상이 남음)
ncols : 진행바 컬럼길이. width 값으로 pixel 단위로 보임.
mininterval, maxinterval : 업데이트 주기. 기본은 mininterval=0.1 sec, maxinterval=10 sec
miniters : Minimum progress display update interval, in iterations.
ascii : True로 하면 '#'문자로 진행바가 표시됨.
initial : 진행 시작값. 기본은 0
bar_format : str
전체 작업량을 알고 있고, 처리된 량으로 진행바를 표시할 경우에, update()로 진행량 추가
출처: https://skillmemory.tistory.com/17 [세상탐험대 블로그]

개인정보가 나오는 디렉토리라 가렸지만 실행해서 파일을 넣어보면 아래처럼 잘 나온다.

pyinstaller

pyinstaller를 통해서 만든 py 파일을 실행가능 파일로 만들었다.
이것도 여러 옵션이 있는데,

pyinstaller
-F : --onefile과 같은 옵션이다. 필요한 라이브러리 등을 합쳐서 하나의 파일로 만들어준다.
이게 없으면 디렉토리 모드로 만들어진다. 그 안에 필요한 dynamically linked library들이 포함된다. 우리가 어떤 파일을 다운로드 받았을 때 zip파일이나 설치해보니 디렉토리가 생긴 것과 같다.
-n : 생성될 실행파일의 이름을 직접 지정할 수 있다. -n 뒤에 바로 파일의 이름을 넣어줘야 한다. 그래서 마지막 옵션으로 쓰는게 낫다.
-w : 프로그램 실행 시 콘솔창을 띄우지 않는다. --noconsole과 같은 옵션.

맥에서는 exe파일이 실행이 안된다. 윈도우에서 돌릴 프로그램이라 데스크탑에서 따로 했다. 크로스 컴파일을 할 수 있는 방법이 있는지 찾아봐야겠다..

마무리

자바와 C/C++만 사용하다가 파이썬의 다양항 라이브러리를 접하니까 적지않은 충격을 받았다..
파이썬도 열심히 공부해봐야지

시험기간에 과제도 쏟아지는 참이라 예전에 했던 프로젝트 포스팅을 못하는데 끝나고 빨리 다시 써야겠다.

profile
공부하고 있어요!

0개의 댓글