tqdm은 일반적으로 for루프와 같은 반복문에서 진행상황을 표시할 수 있게 해주는 모듈이다.
현재 상태를 시각화하고, 진행률을 나타내며, 소요 시간 등을 보여준다.
아래는 간단한 tqdm의 사용법 및 예제 코드이다.
from tqdm import tqdm
import time
for i in tqdm(range(100), desc="Processing", total=100, leave=True, file=open('log.txt', 'w')):
time.sleep(0.1)
위 코드는 0부터 99까지의 숫자를 반복하면서, 진행 상황을 표시하는 예제이다.
for-in문에서의 tqdm 사용법
from tqdm import tqdm
from time import sleep
text = ""
for char in tqdm(["a", "b", "c", "d"]):
sleep(0.25)
text = text + char
Parameter
- iterable
- 진행 상황을 표시할 대상 반복 가능한(iterable) 객체
- 주로 for 루프를 사용하여 반복하며, 리스트, 튜플, 딕셔너리, 파일 등이 될 수 있음
- desc
- 진행 상황 표시줄의 제목을 설정
- default = None
- total
- 진행 상황을 100%로 표시하기 위한 전체 작업 수를 설정.
- Default = None, 작업 수가 알려지지 않은 경우 자동으로 결정
- leave
- 진행 상황 표시줄이 작업이 완료된 후에도 표시될지 여부를 설정
- True로 설정하면 작업이 완료된 후에도 표시줄이 계속해서 표시
- default = True
- file
- 진행 상황을 출력할 파일을 설정
- default = stderr
- stdout 등 다른 파일을 설정할 수 있음
이번에 구글에서 이미지를 crawling 하는 작업을 하다가, while문을 사용하는데 진행률과 소요시간이 궁금해 tqdm을 사용하려고 했다.
하지만 일반적으로 tqdm을 for문에서만 많이 사용하는 것 같고 구글링을 했을 때도 while문에서 사용하는 예제들이 거의 보이지 않았다.
while문과 같은 무한 루프는 일반적으로 언제 끝날지 모르기 때문에 tqdm을 사용하지 않는 것 같다.
하지만 진행률과 현재 소요된 시간을 파악하는데는 도움이 되지 않을까?
while문을 사용할 때도 예를 들어 ‘cnt’라는 변수를 만들어 일정 값이 될때까지 실행되도록 하는 조건을 만들어 사용할때는 tqdm을 똑같이 사용할 수 있지 않을까?
라는 생각을 가지게 되어 찾아보던 중 tqdm모듈도 수동으로 제어할 수 있다는 것을 알게 되었다!
tqdm을 수동으로 제어하는 법, tqdm()
tqdm() 객체를 만들어 update()함수를 통해 수동으로 제어할 수 있다.
pbar = tqdm(total=100)
for i in range(10):
sleep(0.1)
pbar.update(10)
pbar.close()
with()를 사용한 수동 제어 방법
with tqdm(total=100) as pbar:
for i in range(10):
sleep(0.1)
pbar.update(10)
while문에서의 tqdm수동제어를 통한 구글 이미지 크롤링
if __name__ == '__main__':
# URL 생성
query = input('검색어를 입력하세요: ')
url = f'https://www.google.com/search?tbm=isch&q={query}'
# 크롤링 할 이미지 개수 설정
counts = int(input('몇개의 이미지를 다운로드 받으시겠습니까?: '))
# 저장할 경로 설정 및 폴더 생성
path = f'./{query}_crawled'
if not os.path.exists(path):
os.mkdir(path)
# driver 생성 및 target url이동
driver = setWebdriver()
driver.get(url)
time.sleep(1)
# tqdm객체 선언
count = 0
pbar = tqdm(total=counts, desc='Downloading Images...', leave='False')
# Image crawling 시작
while (count < counts):
images = driver.find_elements(By.CLASS_NAME, "DS1iW")
for image in images:
try:
# 이미지 저장
imgUrl = image.get_attribute('src')
urllib.request.urlretrieve(imgUrl, f'{path}/{query}_{count}.jpg')
# print(f"Image saved: {query}_{(count)}.jpg")
count += 1; pbar.update(1) # tqdm 진행 상황 업데이트
except:
pass
# 다음 페이지로 이동
driver.find_element(By.CLASS_NAME, 'frGj1b').click()
time.sleep(rd.uniform(1, 2))
driver.quit()
pbar.close()
Google에서 검색할 쿼리를 입력받고, 수집할 이미지 갯수를 사용자에게 입력받아
while문을 통해 이미지를 수집하면서, tqdm수동 제어를 통해 진행상황과 소요시간을 표시하는 코드이다.
Output
tqdm 수동 제어를 통해 진행상황, 소요시간 등이 정상적으로 출력된다.
이미지를 저장할 디렉토리가 생성되고, 정상적으로 target에 대한 이미지가 3000장이 수집되었다.
'Programming > Python' 카테고리의 다른 글
[Python] 반복문(for문)으로 변수 여러개 한 번에 선언하기, globals() (2) | 2024.06.09 |
---|---|
[Python] 가상환경 (pipenv,venv, conda) 종류 비교 및 사용법 (0) | 2024.05.05 |
[Python] argparse 모듈 사용법 (0) | 2024.04.13 |
[Selenium] iframe에 있는 element 크롤링하기, NoSuchElementException error (0) | 2024.04.09 |
[Python] List comprehension 리스트 안에서 for문, if문 사용하기 (0) | 2024.04.09 |