ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

进程池案例:多任务文件夹复制-显示进度条-理解和分析

2021-11-28 18:33:33  阅读:147  来源: 互联网

标签:old name 进度条 文件夹 file new folder copy 多任务


实验环境:linux系统、python3

实验过程:在工作目录下创建一个test文件夹,将实验文件拷贝其中;在工作目录下创建python文件,将以下代码拷贝其中。

建议:若以下代码阅读遇到困难,可以先去主页阅读文章《进程池案例:多任务文件夹复制-理解和分析》

实验分析:(包含在代码注释中)

代码使用者,若有觉得我分析理解不当之处,欢迎评论区指正;

# 导入所需模块
# zhaohaoqi

import os
import multiprocessing


# 将创建的队列对象作为参数传入复制文件的方法中
def copy_file(queue, file_name, old_folder_name, new_folder_name):
    """完成文件的复制"""
    # 这里要实现用进度条显示文件复制过程,所以这里通过打印模拟复制过程就可以注释掉了
    # print("====>模拟copy文件:从%s---->到%s 文件名是:%s" % (old_folder_name, new_folder_name, file_name))

    old_f = open(old_folder_name + "/" + file_name, "rb")
    content = old_f.read()
    old_f.close()

    new_f = open(new_folder_name + "/" + file_name, "wb")
    new_f.write(content)
    new_f.close()

    # 通过queue调用put()方法将复制好的文件传入到队列中待取
    queue.put(file_name)


def main():
    # 获取用户要copy的文件夹的名字
    old_folder_name = input("请输入要copy的文件夹的名字:")

    # 创建新的文件夹
    try:
        new_folder_name = old_folder_name + "[复件]"
        os.mkdir(new_folder_name)
    except:
        pass

    # 获取文件夹所有待copy的文件名字  listdir()
    file_names = os.listdir(old_folder_name)
    # print(file_names)

    # 创建进程池
    po = multiprocessing.Pool(5)

    #  创建一个队列
    queue = multiprocessing.Manager().Queue()

    # 向进程池添加copy文件的任务
    # 这里将创建的队列对象作为参数传入进程池要执行的方法中。
    for file_name in file_names:
        po.apply_async(copy_file, args=(queue, file_name, old_folder_name, new_folder_name))

    po.close()

    # 因为接下来主进程会因为while循环而不能提前结束,所以进程池对象po无需调用join()方法来堵塞主进程的执行
    # po.join()

    # 调用len()方法获得总共要复制的文件数量
    all_file_num = len(file_names)
    # 创建计时器,原来记录复制完成的文件数量
    copy_ok_num = 0
    while True:
        # 每复制完成一份文件,队里中就有一份文件可取
        file_name = queue.get()
        # 每取一次,计数器加一
        copy_ok_num += 1
        # 将复制进度以百分比的形式打印,实现进度显示
        # \r的作用可以实现每次打印将上一次打印的结果覆盖,实现复制进度单行显示
        print("\r拷贝的进度为:%.2f %%" % (copy_ok_num*100/all_file_num), end="")
        # 当全部文件复制完成,跳出循环
        if copy_ok_num >= all_file_num:
            break

    print()


if __name__ == "__main__":
    main()

标签:old,name,进度条,文件夹,file,new,folder,copy,多任务
来源: https://blog.csdn.net/m0_62064241/article/details/121595142

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有