Hiển thị tiến độ chạy chương trình Python - đăng ký jun88
Hai ngày trước, khi tôi đang thực hiện phân tích query, tôi cần lọc ra những query chứa các thực thể cổ phiếu từ 200.000 query ngẫu nhiên. Số lượng thực thể cổ phiếu khoảng hơn 5000. Do đó, tôi đã viết một vòng lặp để xử lý, với mã nguồn như sau:
1# Đọc danh sách query
2with open('query_20w.txt', 'r', encoding='utf-8') as fq:
3 query = fq.readlines()
4# Đọc danh sách thực thể cổ phiếu
5with open('entity.txt', 'r', encoding='utf-8') as fe:
6 entity = fe.readlines()
7# Sử dụng hai vòng lặp để lọc query
8for q in query:
9 q = q.strip()
10 for e in entity:
11 e = e.strip()
12 # Kiểm tra xem query có chứa thực thể nào không, nếu có thì ghi kết quả vào file
13 if q.find(e) >= 0:
14 with open('result.txt', 'a') as fr:
15 match_str = q + '\t' + e + '\n'
16 fr.write(match_str)
17 break
Vì số lượng đầu ra khá lớn, thay vì hiển thị trực tiếp trên terminal, tôi đã lưu kết quả vào tệp result.txt
. Chương trình này hoạt động tốt nhưng gặp vấn đề là thời gian chạy khá lâu, trong quá trình đó không có bất kỳ thông báo nào về trạng thái tiến trình, và tôi cũng không biết khi nào chương trình sẽ hoàn tất.
Tôi có thể thêm dòng print('done')
ở cuối chương trình để kiểm tra việc chạy đã hoàn thành hay chưa, nhưng điều này vẫn không cung cấp thông tin về trạng thái tiến trình. Vì vậy, tôi muốn tìm cách tạo một thanh tiến độ (progress bar) để theo dõi tình hình chạy chương trình một cách trực quan.
Ý tưởng rất đơn giản: trong phần vòng lặp, tôi sẽ liên tục cập nhật thông tin trạng thái, đồng thời sử dụng ký tự \r
để di chuyển con trỏ về đầu dòng, giúp hiển thị chỉ một dòng thông báo trên terminal.
Dựa trên ý tưởng này, tôi đã chỉnh sửa mã nguồn như sau:
1# Đọc danh sách query
2with open('query_20w.txt', 'r', encoding='utf-8') as fq:
3 query = fq.readlines()
4# Đọc danh sách thực thể cổ phiếu
5with open('entity.txt', 'r', encoding='utf-8') as fe:
6 entity = fe.readlines()
7# Sử dụng hai vòng lặp để lọc query
8cnt_q = cnt_m = 0 # Các biến đếm để theo dõi số lượng query và số kết quả khớp
9for q in query:
10 cnt_e = 0 # Biến đếm để theo dõi số lượng thực thể
11 cnt_q += 1 # Tăng biến đếm query lên 1
12 q = q.strip()
13 for e in entity:
14 cnt_e += 1 # Tăng biến đếm thực thể lên 1
15 e = e.strip()
16 # Kiểm tra xem query có chứa thực thể nào không, nếu có thì ghi kết quả vào file
17 if q.find(e) >= 0:
18 cnt_m += 1 # Tăng biến đếm kết quả khớp lên 1
19 with open('result.txt', 'a') as fr:
20 match_str = q + '\t' + e + '\n'
21 fr.write(match_str)
22 # Cập nhật thông tin trạng thái, sử dụng \r để đưa con trỏ về đầu dòng
23 print('Đang phân tích query thứ {} và thực thể thứ {}, tổng cộng đã xuất {} kết quả...'.format(cnt_q, cnt_e, cnt_m), end='\r')
24 break
25# Thông báo khi chương trình hoàn tất
26print('\nChương trình đã hoàn tất!')
Khi chạy chương xèng trình, terminal sẽ hiển thị thông báo như sau:
1Đang phân tích query thứ 19392 và thực thể thứ 704, tổng cộng đã xuất 235 kết quả...
Trong quá trình tìm kiếm tài liệu trên mạng, tôi cũng thấy rằng có một số thư viện hỗ trợ tạo progress bar. Tuy nhiên, tôi cảm thấy giải pháp này là đơn giản nhất và rất hiệu quả cho mục đích của mình.
Ngoài ra, việc sử dụng ký tự \r
không chỉ giúp tối ưu hóa hiển thị mà còn tránh làm rối terminal bằng cách in quá nhiều dòng thông báo. Điều này đặc biệt hữu ích khi bạn cần giám sát tiến trình chạy chương trình trong thời gian dài.
Hy vọng bài viết này sẽ giúp ích cho những ai đang tìm cách hiển thị tiến độ chạy chương trình Python!