欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python:输出覆盖,输出进度百分比的实现

程序员文章站 2022-05-28 13:07:03
...

以文件复制器的代码为例

import os
import multiprocessing

def copy_file(q, i, file_names, new_file, file_list):
    """复制文件处理"""

    open_file = open(file_names+"/"+i, "rb") # 按照路径打开文件并赋予以二进制位读取的权限
    content = open_file.read() # 将文件内容保存下来
    open_file.close()
    new_open_file = open(new_file+"/"+i, "wb")
    new_open_file.write(content) # 将文件内容写入
    new_open_file.close()

    # 复制好后向队列中加入文件数据
    q.put(i)



def main():

    # 将当前路径下所有目录保存下来
    current_file = os.listdir(os.getcwd())
    # 获取所要复制的文件夹
    file_names = input("请输入要复制的文件夹:")
    # 判断输入的目录名是否在当前路径中存在
    if file_names in current_file:
        try:
            # 创建新的文件来接收复制,为防止重复创建报错,抓取异常
            new_file = file_names + "[复件]"
            os.mkdir(new_file)
        except:
            pass

        # 得到目录下所有文件并以列表的形式保存
        file_list = os.listdir(file_names)
        # 调用multiprocessing模块中Manager()类里的Queue()方法,返回一个对象,在进程池中使用队列必须使用这种方法
        q = multiprocessing.Manager().Queue()
        # 获取输入的目录里文件的数量
        old_file_num = len(file_list)
        # 创建进程池,可同时进行5个进程
        po = multiprocessing.Pool(5)
        for i in file_list:
            po.apply_async(copy_file, args=(q, i, file_names, new_file, file_list))
        po.close()
        # po.join() ,这里不让主进程等到所有文件都复制好才继续运行
        copy_ok = 0 
        while True:
            # 这里必须要取出数据,否则数据文件一直在队列中导致进程池中的队列是满的,从而出现异常,但是在进程池中不会报出异常
            file_name = q.get()
            # 计数加1
            copy_ok += 1
            # 这里用"\r"使每次输出左对齐,覆盖上一次输出结果
            print("\r完成%.2f %%" % (copy_ok *100 / old_file_num), end="")
            if copy_ok >= old_file_num:
                break


    else:
        print("当前目录下没有该文件")



if __name__ == "__main__":
    main()
    print()

实验结果:
Python:输出覆盖,输出进度百分比的实现
最后的百分比会从1%升到100%

·

进度百分比的实现事实上是在无限循环中通过输出重复覆盖实现的,如上代码中

# 这里用"\r"使每次输出左对齐,覆盖上一次输出结果
print("\r完成%.2f %%" % (copy_ok *100 / old_file_num), end="")

这里前面的 ‘\r’转义字符是将光标移到一行的开始,所以\r之后的内容会覆盖掉上次打印的内容
这里通过重复的覆盖上一条输出,从而展现进度百分比从1%到100%的动态显示