stdout中的输出在cmd和Python控制台中有所不同

时间:2019-05-24 12:30:29

标签: python python-3.x cmd console ipython

我是Python的新手,正在研究一个小程序,该程序将给定扩展名的所有文件从一个文件夹及其子文件夹复制到另一个目录。最近,我添加了一个简单的进度栏和一个剩余文件计数器。 问题是,当我从cmd运行它并且计数器从1000到999 cmd时,在最后一位而不是空格处添加了零。此外,当程序完成时,剩余文件计数器应用单词“完成”代替。而且效果也不佳。

我尝试用print替换sys.stdout.write,并尝试不使用f字符串,结果是相同的。

def show_progress_bar(total, counter=0, length=80):
    percent = round(100 * (counter / total))
    filled_length = int(length * counter // total)
    bar = '=' * filled_length + '-' * (length - filled_length)
    if counter < total:
        suffix = f'Files left: {total - counter}'
    else:
        suffix = 'Done.'
    sys.stdout.write(f'\rProgress: |{bar}| {percent}% {suffix}')
    sys.stdout.flush()

def selective_copy(source, destination, extension):
    global counter
    show_progress_bar(total)
    for foldername, subfolders, filenames in os.walk(source):
        for filename in filenames:
            if filename.endswith(extension):
                if not os.path.exists(os.path.join(destination, filename)):
                    shutil.copy(os.path.join(foldername, filename), os.path.join(destination, filename))
                else:
                    new_filename = f'{os.path.basename(foldername)}_{filename}'
                    shutil.copy(os.path.join(foldername, filename), os.path.join(destination, new_filename))
                counter += 1
                show_progress_bar(total, counter)

我希望cmd中的输出将与控制台中的输出相同,这是这样的: 程序正在运行:

Progress: |=========-----------------------------------------------------------------------| 12% Files left: 976

程序完成:

Progress: |================================================================================| 100% Done.

但是在cmd中我得到了: 程序正在运行:

Progress: |=========-----------------------------------------------------------------------| 12% Files left: 9760

程序完成:

Progress: |================================================================================| 100% Done. left: 100

1 个答案:

答案 0 :(得分:1)

通常,打印“ \ r”会将光标返回到该行的开头,但是不会擦除任何已写入的内容。因此,如果您在输入“ 1000”后加上“ \ r”再加上“ 999”,则“ 1000”的最后一个0仍然可见。

(我不确定为什么在您的Python控制台中不会发生这种情况。也许它以不同的方式解释“ \ r”。很难确切地说出您所运行的软件。)

一种解决方案是在输出之后打印几个空格,以确保覆盖更长的旧消息。您可能只用一个空格来保留“文件剩余:”后缀,因为该空格最多最多减少一个字符,但是“完成”后缀将需要更多空间。

if counter < total:
    suffix = f'Files left: {total - counter} '
else:
    suffix = 'Done.               '
相关问题