5 多进程copy文件
Posted 不要被骄傲遮蔽了双眼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了5 多进程copy文件相关的知识,希望对你有一定的参考价值。
1.如何进行开发?
2.版本1:程序大框架
#1.创建一个文件夹 #2.获取old文件夹中所有的文件名字 #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中
3.版本2:创建一个文件夹
1)ipython3 获取小知识点
2)写程序
3)测试程序
4)版本2:程序
import os #1.创建一个文件夹 old_file_name = input("请输入你要copy的文件夹:") new_file_name = old_file_name + "-附件" #print(new_file_name) os.mkdir(new_file_name) #2.获取old文件夹中所有的文件名字 #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中
4.版本3:获取old文件夹中的所有文件
1)获取知识点
In [12]: import os In [13]: os.li os.linesep os.link os.listdir os.listxattr In [13]: os.listdir("test") Out[13]: [\'17-进程池.py\', \'12-multiprocessing.py\', \'10-多个Fork.py\', \'04-吃包子.py\', \'01-多任务.py\',\'08-全局变量.py\', \'11-fork多个.py\', \'14-join.py\', \'09-多个Fork.py\', \'02-fork.py\']
2)写程序
3)测试
4)版本3:程序
import os #0.获取要copy的文件夹的名字 old_file_name = input("请输入你要copy的文件夹:") #1.创建一个文件夹 new_file_name = old_file_name + "-附件" #print(new_file_name) os.mkdir(new_file_name) #2.获取old文件夹中所有的文件名字 file_names = os.listdir(old_file_name) # print(file_names) #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中
5.版本4:模块化
from multiprocessing import Pool import os def copyFileTask(): "完成copy一个文件的功能" pass def main(): #0.获取要copy的文件夹的名字 old_file_name = input("请输入你要copy的文件夹:") #1.创建一个文件夹 new_file_name = old_file_name + "-附件" #print(new_file_name) os.mkdir(new_file_name) #2.获取old文件夹中所有的文件名字 file_names = os.listdir(old_file_name) # print(file_names) #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 p = Pool(5) p.apply_async(xxx) if __name__ == "__main__": main()
6.版本5:多进程copy文件
1)初始化版
from multiprocessing import Pool import os def copyFileTask(): "完成copy一个文件的功能" fr = open() fw = open() content = fr.read() fw.write(content) fw.close() fr.close() def main(): #0.获取要copy的文件夹的名字 old_file_name = input("请输入你要copy的文件夹:") #1.创建一个文件夹 new_file_name = old_file_name + "-附件" #print(new_file_name) os.mkdir(new_file_name) #2.获取old文件夹中所有的文件名字 file_names = os.listdir(old_file_name) # print(file_names) #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 p = Pool(5) p.apply_async(copyFileTask) if __name__ == "__main__": main()
2)查看知识点
In [14]: from multiprocessing import Pool In [15]: p = Pool(5) In [16]: p.a p.apply p.apply_async In [18]: help(p.apply_async)
Help on method apply_async in module multiprocessing.pool: apply_async(func, args=(), kwds={}, callback=None, error_callback=None) method of multiprocessing.pool.Pool instance Asynchronous version of `apply()` method. (END)
3)版本2:打开关闭对应的文件名
from multiprocessing import Pool import os def copyFileTask(name,old_file_name,new_file_name): "完成copy一个文件的功能" fr = open(old_file_name + "/" + name) fw = open(new_file_name + "/" + name) content = fr.read() fw.write(content) fw.close() fr.close() def main(): #0.获取要copy的文件夹的名字 old_file_name = input("请输入你要copy的文件夹:") #1.创建一个文件夹 new_file_name = old_file_name + "-附件" #print(new_file_name) os.mkdir(new_file_name) #2.获取old文件夹中所有的文件名字 file_names = os.listdir(old_file_name) # print(file_names) #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 p = Pool(5) for name in file_names: p.apply_async(copyFileTask,args=(name,old_file_name,new_file_name)) if __name__ == "__main__": main()
4)2窗口测试
5)调试程序,添加print
4 def copyFileTask(name,old_file_name,new_file_name): 5 "完成copy一个文件的功能" 6 print(name) 7 fr = open(old_file_name + "/" + name, "r") 8 fw = open(new_file_name + "/" + name, "w") 9 10 content = fr.read() 11 fw.write(content) 12 13 fw.close() 14 fr.close() 15 print("------") 16
python@ubuntu:~/python06/04-多进程copy文件$ python3 copyFile.py 请输入你要copy的文件夹:test 17-进程池.py ------ 12-multiprocessing.py 10-多个Fork.py ------ 04-吃包子.py ------ 07-谁先退出.py ------ 01-多任务.py ------ 15-Process创建的子进程和父进程的关系.py 20-Queue.py ------ ------
6)调试成功
from multiprocessing import Pool import os def copyFileTask(name,old_file_name,new_file_name): "完成copy一个文件的功能" print(name) fr = open(old_file_name + "/" + name, "r") fw = open(new_file_name + "/" + name, "w") content = fr.read() fw.write(content) fw.close() fr.close() print("------") def main(): #0.获取要copy的文件夹的名字 old_file_name = input("请输入你要copy的文件夹:") #1.创建一个文件夹 new_file_name = old_file_name + "-附件" #print(new_file_name) os.mkdir(new_file_name) #2.获取old文件夹中所有的文件名字 file_names = os.listdir(old_file_name) # print(file_names) #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 p = Pool(5) for name in file_names: p.apply_async(copyFileTask,args=(name,old_file_name,new_file_name)) p.close() p.join() #主进程要等待子进程 if __name__ == "__main__": main()
├── copyFile.py ├── test │ ├── 01-多任务.py │ ├── 02-fork.py │ ├── 03-fork2.py │ ├── 04-吃包子.py │ ├── 05-fork的返回值.py │ ├── 06-getppid.py │ ├── 07-谁先退出.py │ ├── 08-全局变量.py └── test-附件 ├── 01-多任务.py ├── 02-fork.py ├── 03-fork2.py ├── 04-吃包子.py ├── 05-fork的返回值.py ├── 06-getppid.py ├── 07-谁先退出.py ├── 08-全局变量.py
7.版本6:主进程:显示进度条 Queue
python@ubuntu:~/python06/04-多进程copy文件$ python3 copyFile.py 请输入你要copy的文件夹:test copy的进度是:100.00% 已完成copy...
from multiprocessing import Pool,Manager import os import time def copyFileTask(name,old_file_name,new_file_name,queue): "完成copy一个文件的功能" # print(name) fr = open(old_file_name + "/" + name, "r") fw = open(new_file_name + "/" + name, "w") content = fr.read() fw.write(content) fw.close() fr.close() # time.sleep(1) #让进度条显示更加明显 queue.put(name) #print("------") def main(): #0.获取要copy的文件夹的名字 old_file_name = input("请输入你要copy的文件夹:") #1.创建一个文件夹 new_file_name = old_file_name + "-附件" #print(new_file_name) os.mkdir(new_file_name) #2.获取old文件夹中所有的文件名字 file_names = os.listdir(old_file_name) # print(file_names) #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 p = Pool(5) queue = Manager().Queue() for name in file_names: p.apply_async(copyFileTask,args=(name,old_file_name,new_file_name,queue)) num = 0 allNum = len(file_names) while True: queue.get() num += 1 copyRate = num/allNum print("\\rcopy的进度是:%.2f%%"%(copyRate*100),end="") if num == allNum: break print("\\n已完成copy...") # p.close() # p.join() #主进程要等待子进程 if __name__ == "__main__": main()
8.优化版:抛出异常
- 每次都要删除已经创建的test-附件,对代码进行异常处理,即可
from multiprocessing import Pool,Manager import os import time def copyFileTask(name,old_file_name,new_file_name,queue): "完成copy一个文件的功能" # print(name) fr = open(old_file_name + "/" + name, "r") fw = open(new_file_name + "/" + name, "w") content = fr.read() fw.write(content) fw.close() fr.close() #time.sleep(1) #让进度条显示更加明显 queue.put(name) #print("------") def main(): #0.获取要copy的文件夹的名字 old_file_name = input("请输入你要copy的文件夹:") #1.创建一个文件夹 new_file_name = old_file_name + "-附件" #print(new_file_name) try: os.mkdir(new_file_name) except Exception as e: print("该文件附件已经存在,即将覆盖") #2.获取old文件夹中所有的文件名字 file_names = os.listdir(old_file_name) # print(file_names) #3.使用多进程的方式copy原文件夹中的所有文件到新文件夹中 p = Pool(5) queue = Manager().Queue() for name in file_names: p.apply_async(copyFileTask,args=(name,old_file_name,new_file_name,queue)) num = 0 allNum = len(file_names) while True: queue.get() num += 1 copyRate = num/allNum print("\\rcopy的进度是:%.2f%%"%(copyRate*100),end="") if num == allNum: break print("\\n已完成copy...") # p.close() # p.join() #主进程要等待子进程 if __name__ == "__main__": main()
以上是关于5 多进程copy文件的主要内容,如果未能解决你的问题,请参考以下文章