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("
copy的进度是:%.2f%%"%(copyRate*100),end="")
        if num == allNum:
            break
    print("
已完成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("
copy的进度是:%.2f%%"%(copyRate*100),end="")
        if num == allNum:
            break
    print("
已完成copy...")

   # p.close()
  #  p.join()   #主进程要等待子进程


if __name__ == "__main__":
    main()

    

原文地址:https://www.cnblogs.com/venicid/p/7965646.html