Roh*_*ena 100 python jupyter-notebook tqdm
我正在使用tqdm我在Jupyter笔记本中运行的脚本中打印进度.我通过打印所有消息到控制台tqdm.write().但是,这仍然给我一个偏差的输出,如下所示:
也就是说,每次必须打印新行时,下一行都会打印一个新的进度条.当我通过终端运行脚本时,这不会发生.我怎么解决这个问题?
小智 161
尝试使用tqdm.notebook.tqdm,而不是tqdm作为概述这里.它在这个阶段是实验性的,但在大多数情况下效果很好.
这可以像将导入更改为:
from tqdm.notebook as tqdm
祝好运!
编辑:测试后,似乎tqdm在Jupyter笔记本中的"文本模式"中实际上工作正常.很难说,因为您没有提供最小的示例,但看起来您的问题是由每次迭代中的print语句引起的.print语句在每个状态栏更新之间输出一个数字(~0.89),这会弄乱输出.尝试删除print语句.
小智 31
大多数答案现在已经过时了。如果正确导入tqdm 会更好。
from tqdm import tqdm_notebook as tqdm
Run Code Online (Sandbox Code Playgroud)

de1*_*de1 28
对于tqdm_notebook不适合您的情况,这是另一种选择.
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values)) as pbar:
for i in values:
pbar.write('processed: %d' %i)
pbar.update(1)
sleep(1)
Run Code Online (Sandbox Code Playgroud)
输出看起来像这样(进度会显示为红色):
0%| | 0/3 [00:00<?, ?it/s]
processed: 1
67%|??????? | 2/3 [00:01<00:00, 1.99it/s]
processed: 2
100%|??????????| 3/3 [00:02<00:00, 1.53it/s]
processed: 3
Run Code Online (Sandbox Code Playgroud)
问题是stdout和stderr的输出是按照新行异步和单独处理的.
如果说Jupyter在stderr上收到第一行,然后是stdout上的"已处理"输出.然后,一旦它在stderr上收到输出以更新进度,它就不会返回并更新第一行,因为它只会更新最后一行.相反,它必须写一个新的行.
一种解决方法是将两者输出到stdout:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
Run Code Online (Sandbox Code Playgroud)
输出将更改为(不再为红色):
processed: 1 | 0/3 [00:00<?, ?it/s]
processed: 2 | 0/3 [00:00<?, ?it/s]
processed: 3 | 2/3 [00:01<00:00, 1.99it/s]
100%|??????????| 3/3 [00:02<00:00, 1.53it/s]
Run Code Online (Sandbox Code Playgroud)
在这里我们可以看到Jupyter似乎直到行尾才清楚.我们可以通过添加空格为此添加另一种解决方法.如:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.write('processed: %d%s' % (1 + i, ' ' * 50))
pbar.update(1)
sleep(1)
Run Code Online (Sandbox Code Playgroud)
这给了我们:
processed: 1
processed: 2
processed: 3
100%|??????????| 3/3 [00:02<00:00, 1.53it/s]
Run Code Online (Sandbox Code Playgroud)
通常可能更直接的是不要有两个输出,而是更新描述,例如:
import sys
from time import sleep
from tqdm import tqdm
values = range(3)
with tqdm(total=len(values), file=sys.stdout) as pbar:
for i in values:
pbar.set_description('processed: %d' % (1 + i))
pbar.update(1)
sleep(1)
Run Code Online (Sandbox Code Playgroud)
使用输出(描述在处理时更新):
processed: 3: 100%|??????????| 3/3 [00:02<00:00, 1.53it/s]
Run Code Online (Sandbox Code Playgroud)
你可以通过普通的tqdm使它工作得很好.但是如果tqdm_notebook适合你,那就用它(但那时你可能不会那么读).
mja*_*sie 14
要完成 oscarbranson 的回答:可以根据运行的位置自动选择控制台或笔记本版本的进度条:
from tqdm.autonotebook import tqdm
Run Code Online (Sandbox Code Playgroud)
更多信息可以在这里找到
Jam*_*ers 14
以上都不适合我。我发现在错误后运行以下对这个问题进行排序(它只是清除后台进度条的所有实例):
from tqdm import tqdm
# blah blah your code errored
tqdm._instances.clear()
Run Code Online (Sandbox Code Playgroud)
如果此处的其他技巧不起作用,并且-和我一样-您正在通过中使用pandas集成progress_apply,则可以进行tqdm处理:
from tqdm.auto import tqdm
tqdm.pandas()
df.progress_apply(row_function, axis=1)
Run Code Online (Sandbox Code Playgroud)
这里的重点在于tqdm.auto模块。如他们在IPython Notebook中使用的说明中所述,这使tqdmJupyter笔记本和Jupyter控制台使用的进度条格式之间可以进行选择-由于我这一方面仍然缺乏进一步的研究,因此选择的特定格式tqdm.auto可以在中顺利进行pandas,而所有其他格式都没有不是,progress_apply特别是。
对于使用 Windows 并且无法使用此处提到的任何解决方案解决重复条问题的每个人。我必须colorama按照tqdm修复它的已知问题中的说明安装该软件包。
pip install colorama
Run Code Online (Sandbox Code Playgroud)
用这个例子试试:
from tqdm import tqdm
from time import sleep
for _ in tqdm(range(5), "All", ncols = 80, position = 0):
for _ in tqdm(range(100), "Sub", ncols = 80, position = 1, leave = False):
sleep(0.01)
Run Code Online (Sandbox Code Playgroud)
这将产生类似的东西:
All: 60%|???????????????????????? | 3/5 [00:03<00:02, 1.02s/it]
Sub: 50%|??????????????????? | 50/100 [00:00<00:00, 97.88it/s]
Run Code Online (Sandbox Code Playgroud)
使用Python 3.9.2和tqdm==4.62.3:
from tqdm.notebook import tqdm
for item in tqdm(list_of_items):
do_something(item)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
73168 次 |
| 最近记录: |