实验环境: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()