如何将tqdm进度条保持在终端底部?
这里是代码
def download_from_dict(path_link_dict, folder)
counter = 0
for path, link, name in tqdm(path_link_dict):
counter = counter + 1
if os.path.isfile(folder + path + name):
print('[ Already there! ] ' + name)
continue
if not os.path.isdir(folder + path):
os.makedirs(folder + path)
response = requests.get(link, headers=HEADERS)
with open(folder + path + name, 'wb') as file:
file.write(response.content)
print('[*] Downloaded ' + name)
输出结果是
progress bar..
[*] Downloaded something..
Progress bar..
[*] Downloaded something
我想要的输出(我希望进度条停留在终端的底部。)
[*] Downloaded something
[*] Downloaded something
[*] Downloaded something
progress bar..
我尝试过在tqdm函数中使用leave=False、position=0和barfmt这些参数,但都没有效果。我还试过在[*] Downloaded前面加上\r,但因为进度条比打印的内容要长,所以只清除了其中的一部分。我查阅了tqdm的文档,但还是没能解决这个问题,你能帮忙吗?
2 个回答
0
这里没有简单直接的解决办法,但在StackOverflow上有一些有趣的讨论和解决方案,关于如何做到这一点,可以参考之前的一些问题:通过tqdm.write()重定向Python脚本中的打印命令和使用tqdm的Python进度条不在同一行显示
这也取决于你是需要在标准终端、Jupyter Notebook还是其他输出环境中使用...
0
你可以试试用 tqdm.write()
来代替 print()
,不过我建议你不要为了适应这个库而调整你的代码,而是使用一个专门为你的需求设计的库。这个库叫做 Enlighten
你可以把上面的代码替换成(for 循环里的内容不变):
import enlighten
MANAGER = enlighten.get_manager()
def download_from_dict(path_link_dict, folder)
pbar = MANAGER.counter(total=len(path_link_dict), desc='Downloading', unit='files')
for path, link, name in pbar(path_link_dict):
if os.path.isfile(folder + path + name):
print('[ Already there! ] ' + name)
continue
if not os.path.isdir(folder + path):
os.makedirs(folder + path)
response = requests.get(link, headers=HEADERS)
with open(folder + path + name, 'wb') as file:
file.write(response.content)
print('[*] Downloaded ' + name)
你可以在 文档 中找到更多信息和自定义选项。
另外,看看 pathlib,它可以让你的文件操作更简单。