我正在编写一个Python 2程序来查找文件。该程序应该在搜索的每次迭代中打印它搜索的每个目录,但是总是在终端中的同一行(即通过擦除已经存在的文本并在再次打印之前将光标移动到行的开头)。 / p>
这是我到目前为止的代码:
import os
import sys
for root, dirs, files in os.walk("/"):
print root +'\r',
print '\x1b[2K\r',
我的问题是它在新行上启动每个打印输出(当它更改目录时);换句话说,它不会重复使用旧行。
如何确保所有打印输出在终端中单行显示?
答案 0 :(得分:2)
您需要刷新stdout
缓冲区(取决于终端系统),并用空格填充该行。例如:
for root, dirs, files in os.walk(path):
print "%-80s\r" % (root),
sys.stdout.flush()
time.sleep(1) # For testing
这假设任意最大文件名长度为80个字符。
编辑:
这个新解决方案使用curses,它是标准库的一部分:
import curses
import os
import time
win = curses.initscr()
for root, dirs, files in os.walk(path):
win.clear()
win.addstr(0, 0, root)
win.refresh()
time.sleep(1) # For testing purposes
curses.endwin()
答案 1 :(得分:1)
这应该这样做。
for root, dirs, files in os.walk(path):
print '\r', root,
\r
告诉python回放到当前行的开头,就像旧的打字机一样。
如果当前路径比前一路径短,您可能希望用空格填充以擦除行的其余部分。
如果文本长于一行,它仍会溢出到下一行。
答案 2 :(得分:0)
受到来自这里和那里的几个想法的启发,这对我很有用:
import os
import sys
import time # only if you use sleep() function for debugging
top_folder = "/"
max_line_length = 80
for root, dirs, files in os.walk(top_folder):
message = root
# truncate if the path longer than what you want it to be
if len(message) > max_line_length:
message = '[...]' + message[-max_line_length+5:]
# prepare the output string of lenght determined by a variable
output_string = '{0: <' + str(max_line_length) + '}\r' # \r = carret return
# output
print output_string.format(message), # the comma is crucial here
# to see it in action in slow-motion
time.sleep(.4)
sleep()功能行之前的最后2个代码行可以组合成一行:
print '{msg: <{width}}\r'.format(msge = message, width = max_line_length),