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文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 多处理进程中运行较慢的 OpenCV 代码片段

应用:文件夹copy器(多进程版)

代码片段:Shell脚本实现重复执行和多进程

[Python3] 043 多线程 简介

python多线程

线程学习知识点总结