zoukankan      html  css  js  c++  java
  • 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()

        

  • 相关阅读:
    2016 Al-Baath University Training Camp Contest-1 I
    2016 Al-Baath University Training Camp Contest-1 H
    2016 Al-Baath University Training Camp Contest-1 G
    2016 Al-Baath University Training Camp Contest-1 F
    2016 Al-Baath University Training Camp Contest-1 D
    2016 Al-Baath University Training Camp Contest-1 C
    2016 Al-Baath University Training Camp Contest-1 B
    2016 Al-Baath University Training Camp Contest-1 A
    2015年江西理工大学C语言程序设计竞赛(初级组)
    2013年江西理工大学C语言程序设计竞赛(初级组)
  • 原文地址:https://www.cnblogs.com/venicid/p/7965646.html
Copyright © 2011-2022 走看看