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

以文件复制器的代码为例

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()

实验结果:
在这里插入图片描述
最后的百分比会从1%升到100%

·

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

此时一位小白路过

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值