Python print语句不使用回车符打印任何内容

2024-05-22 18:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个简单的工具,从光盘读取文件,做一些图像处理,并返回算法的结果。由于程序有时可能需要一段时间,我喜欢有一个进度条,以便我知道它在程序中的位置。由于我不喜欢把命令行弄得乱七八糟,而且我是在Unix平台上,所以我想使用'\r'字符只在一行上打印进度条。

但当我有这个密码的时候,它什么也印不出来。


# Files is a list with the filenames
for i, f in enumerate(files):
    print '\r%d / %d' % (i, len(files)),
    # Code that takes a long time

我也试过:


print '\r', i, '/', len(files),

为了确保这在python中有效,我尝试了:


heartbeat = 1
while True:
    print '\rHello, world', heartbeat,
    heartbeat += 1

这个代码工作得很好。发生什么事?我对Linux上回车的理解是,只要不在任何地方打印换行符,它只会将换行符移动到开头,然后我就可以覆盖以前编写的旧文本。但这似乎没有发生。

还有,在命令行中显示进度条的方法是否比我当前尝试的更好?


Tags: 文件工具进度条命令行程序算法lenunix
3条回答

Linux中对回车的处理在终端模拟器之间有很大的不同。

通常,人们会使用终端转义代码,告诉终端仿真器在屏幕上移动虚拟“回车”(想想在BBS线上运行的全屏程序)。我知道的是VT100转义码:

\e[A:向上
\e[B:向下
\e[C:右
\e[D:左
\e[1~:主页
\e[4~:结束

其中,\e是转义字符,\x1b

尝试用\e[1~替换所有\r

另见this post

尝试在print语句后添加sys.stdout.flush()。有可能print在写入换行符之前不会刷新输出,这不会在这里发生。

如果您的终端是线路缓冲的,如果您不发出换行符,则可能需要sys.stdout.flush()来查看您的打印。

相关问题 更多 >

    热门问题