【问题标题】:Print and overwrite last variable-length line (in IPython)打印并覆盖最后一个可变长度行(在 IPython 中)
【发布时间】:2020-03-24 22:07:22
【问题描述】:

之前已经询问并回答了如何覆盖最后打印行的问题(例如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 的方式来做到这一点?

为了记录,我在 Spyder 上使用 Python 3.7 和 Windows 上的 IPython 控制台

【问题讨论】:

  • @MrFuppes 我不确定环境的哪一部分在这里/很重要,感谢您的建议(现已编辑)
  • 必须对我的答案进行编辑:get_terminal_size().columns 返回的线宽设置似乎不适用于很长的字符串,至少在我的 IPython / Spyder 版本中...( Spyder 4.0.0rc3 中的 IPython 7.9.0)

标签: python ipython spyder


【解决方案1】:

Sayandip Dutta's answer 的基础上,您还可以使用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)

【讨论】:

    【解决方案2】:

    你可以试试这个:

    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

    【讨论】:

      猜你喜欢
      • 2014-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 2012-01-13
      相关资源
      最近更新 更多