有没有办法将 TQDM 控制台输出保存到文件中?

Phi*_*Guo 0 python console tqdm

我一直在尝试将tqdm Python 库中的tqdm进度条保存到文本文件中。我尝试将sys.stdoutsys.stderr重定向到一个文件:

在此输入图像描述

但是,仅保存stdout的输出(例如打印语句),而不保存tqdm进度条。进度条保留在控制台中。

fur*_*ras 5

如果我重定向sys.stderr到文件然后我得到tqdm文件。

\n
import tqdm\nimport time\nimport sys\n\nfh = open(\'output.txt\', \'w\')  # one file for both `stdout` and `stderr`\n\noriginal_stderr = sys.stderr\nsys.stderr = fh\n#original_stdout = sys.stdout\n#sys.stdout = fh\n\nitems = 100\n\nfor i in tqdm.tqdm(range(items)):\n    time.sleep(0.1)\n\nsys.stderr = original_stderr\n#sys.stdout = original_stdout\n\nfh.close()\n
Run Code Online (Sandbox Code Playgroud)\n

或者我可以使用tqdm(..., file=fh)

\n
import tqdm\nimport time\n\nfh = open(\'output.txt\', \'w\')\n\nitems = 100\n\nfor i in tqdm.tqdm(range(items), file=fh):\n    time.sleep(0.1)\n\nfh.close()\n
Run Code Online (Sandbox Code Playgroud)\n

但是这个文件有这样的内容

\n
  0%|          | 0/100 [00:00<?, ?it/s]\n  1%|          | 1/100 [00:00<00:09,  9.98it/s]\n  2%|\xe2\x96\x8f         | 2/100 [00:00<00:09,  9.84it/s]\n  3%|\xe2\x96\x8e         | 3/100 [00:00<00:09,  9.87it/s]\n  4%|\xe2\x96\x8d         | 4/100 [00:00<00:09,  9.90it/s]\n  5%|\xe2\x96\x8c         | 5/100 [00:00<00:09,  9.92it/s]\n  6%|\xe2\x96\x8c         | 6/100 [00:00<00:09,  9.93it/s]\n  7%|\xe2\x96\x8b         | 7/100 [00:00<00:09,  9.93it/s]\n  8%|\xe2\x96\x8a         | 8/100 [00:00<00:09,  9.94it/s]\n  9%|\xe2\x96\x89         | 9/100 [00:00<00:09,  9.94it/s]\n 10%|\xe2\x96\x88         | 10/100 [00:01<00:09,  9.94it/s]\n 11%|\xe2\x96\x88         | 11/100 [00:01<00:08,  9.94it/s]\n 12%|\xe2\x96\x88\xe2\x96\x8f        | 12/100 [00:01<00:08,  9.94it/s]\n 13%|\xe2\x96\x88\xe2\x96\x8e        | 13/100 [00:01<00:08,  9.95it/s]\n 14%|\xe2\x96\x88\xe2\x96\x8d        | 14/100 [00:01<00:08,  9.95it/s]\n 15%|\xe2\x96\x88\xe2\x96\x8c        | 15/100 [00:01<00:08,  9.95it/s]\n 16%|\xe2\x96\x88\xe2\x96\x8c        | 16/100 [00:01<00:08,  9.94it/s]\n 17%|\xe2\x96\x88\xe2\x96\x8b        | 17/100 [00:01<00:08,  9.95it/s]\n 18%|\xe2\x96\x88\xe2\x96\x8a        | 18/100 [00:01<00:08,  9.95it/s]\n 19%|\xe2\x96\x88\xe2\x96\x89        | 19/100 [00:01<00:08,  9.95it/s]\n 20%|\xe2\x96\x88\xe2\x96\x88        | 20/100 [00:02<00:08,  9.95it/s]\n 21%|\xe2\x96\x88\xe2\x96\x88        | 21/100 [00:02<00:07,  9.95it/s]\n
Run Code Online (Sandbox Code Playgroud)\n

tqdm使用 char\\r移动到行首并打印新文本。
\n我在 Linux 上的编辑器将其显示为新行,但在 Windows 上您可能会在一行中看到它,例如

\n
  0%|          | 0/100 [00:00<?, ?it/s]\\r  1%|          | 1/100 [00:00<00:09,  9.98it/s]\\r  2%|\xe2\x96\x8f         | 2/100 [00:00<00:09,  9.84it/s]\n
Run Code Online (Sandbox Code Playgroud)\n
\n

如果你想获得最终价值it/s那么你宁愿使用time.time()手动使用和计算它。

\n
import tqdm\nimport time\nimport sys\n\nitems = 100\n\nstart = time.time()\n\nfor i in tqdm.tqdm(range(items)):\n    time.sleep(0.1)\n\nend = time.time()\n\ndiff = end-start\nitems_per_second = items/diff\n\nprint(f\'time: {diff:.2f} s | {items_per_second:.2f} it/s\')\n
Run Code Online (Sandbox Code Playgroud)\n

结果:

\n
time: 10.09 s | 9.91 it/s\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用fh.write()print(..., file=fh)或 重定向将其写入文件sys.stdout当您在控制台/终端中运行代码时,

\n
python script.py > output.txt\n
Run Code Online (Sandbox Code Playgroud)\n
\n