如何让tqdm进度条始终显示在终端底部?
解决方案
要让tqdm进度条固定在终端底部,核心是用tqdm.write()替代普通print()输出信息,同时配置tqdm参数确保进度条位置稳定。以下是修改后的代码:
import os import requests from tqdm import tqdm def download_from_dict(path_link_dict, folder): counter = 0 # 固定进度条位置并保持在终端底部 for path, link, name in tqdm(path_link_dict, position=0, leave=True): counter += 1 file_path = os.path.join(folder, path, name) if os.path.isfile(file_path): # 用tqdm.write输出,避免打乱进度条位置 tqdm.write(f'[ Already there! ] {name}') continue dir_path = os.path.join(folder, path) if not os.path.isdir(dir_path): os.makedirs(dir_path) response = requests.get(link, headers=HEADERS) with open(file_path, 'wb') as file: file.write(response.content) tqdm.write(f'[*] Downloaded {name}')
关键修改说明:
- 替换
print为tqdm.write:tqdm的write方法会自动在进度条上方输出内容,不会触发终端换行导致进度条移位,完美避免了普通print的干扰。 - tqdm参数配置:
position=0:固定进度条在终端的指定行,配合write方法,进度条会始终保持在终端最后一行;leave=True:任务完成后保留进度条在底部(若不需要保留,可改为False)。
- 路径优化:用
os.path.join替代手动拼接路径,避免跨平台路径分隔符出错。
之前尝试无效的原因:
- 普通
print()会强制终端换行,tqdm只能在新行重新绘制进度条,无法固定位置; \r转义符仅能清除当前行内容,若进度条长度超过打印文本,残留字符无法彻底清除,而tqdm.write()会自动处理终端输出位置,从根源解决这个问题。
内容的提问来源于stack exchange,提问作者grayhatter
相关产品推荐
相关产品推荐

