打印并覆盖最后一个可变长度行(在 IPython 中)

Print and overwrite last variable-length line (in IPython)

关于如何覆盖最后一行的问题已经被问过并得到了回答(例如 here),但似乎所有的答案都假定您用类似长度的内容覆盖了最后一行,例如进度指示器,其中“2 % 完成”覆盖“1 % 完成”。

但是,我想打印可变长度语句,例如 "Now reading file path/to/xxx/file.ext...",其中下一个文件名可能更短。 如果我使用简单的方法,首先打印 "Now reading ./path/with/many/long-named/subdirectories/version/LongFileNameAsWell.ext...",然后打印 "Now reading ./file.ext...",结果是一行

Now reading ./file.ext... ng-named/subdirectories/version/LongFileNameAsWell.ext

一种解决方法是在我所有的打印字符串中附加空格,但我需要确保我不会换行,同时仍然有足够的空间来覆盖整个文件名。这一切都增加了很多开销、错误空间等。

有没有 Pythonic 方法来做到这一点?

郑重声明,我在 Windows

上使用 IPython 控制台在 Spyder 上使用 Python 3.7

你可以试试这个:

lst = ["Now reading file path/to/xxx/file.ext...","Now reading ./path/with/many/long-named/subdirectories/version/LongFileNameAsWell.ext...","Now reading ./file.ext..."]
maxlen = 0

for l in lst:
    maxlen = max(maxlen,len(l))
    print('\r',end = l.ljust(maxlen,' '))

当然不是 lst 而是你的目录,而不是 l 会有文件名。

的基础上,您还可以使用 shutil 中的 get_terminal_size 来获取当前行长度设置,然后写入新行并在短于该行时附加空格.

import time
from shutil import get_terminal_size

l = ["1st statment is long",
     "2nd short",
     "3rd statement is much longer...",
     "done."]

sz = get_terminal_size().columns
for i in l:
    print('\r', end=i.ljust(sz, ' '))
    time.sleep(1)

编辑: 我刚刚意识到这可能不适用于很长的行......所以你将不得不使用类似

的东西
lines = ["1st statment is long",
         "2nd short",
         "3rd statement is much longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer longer...",
         "more lines",
         "done."]

widths = [0] + [len(l) for l in lines][:-1]
for l, w in zip(lines, widths):
    print('\r', end=l.ljust(w, ' '))
    time.sleep(1)