Python多进程拷贝文件

 备注:主要要弄清楚需求是做什么。多进程,主要是用什么实现,怎么实现,这里用的进程池来实现。文件在文件夹里面就申请进程池,加入任务,开始执行,至于拷贝过程就是普通的文件读写操作了

#创建文件夹
#2获取old文件夹中所有的文件的名字
#3.使用多进程方式,copy所有文件到新的文件夹:中

import os
from multiprocessing import Pool
from multiprocessing import Manager

def copyFileTask(name,oldFolderName,newFoldName,queue):#完成拷贝文件的内容
    fr=open(oldFolderName+"/"+name,"r") #打开老文件,要拷贝的文件
   # print(fr)
    fw=open(newFoldName+"/"+name,"w")#打开新文件,拷贝的目的文件
   # print(fw)
    content=fr.read() #读
    #print(content)
    fw.write(content)#写
#    print("写文件")
    fr.close()
    fw.close()
    queue.put(name) #拷贝的文件名扔进队列。方便之后计算拷贝进度

def main():
    #0#获取用户要copy的文件夹的名字#os.path.dirname(os.getcwd()))获取上级目录
    oldFolderName=input("请输入文件夹的名字:")
    # print(os.getcwd())
    #创建文件夹
    newFoldName=oldFolderName+'_复件'
    os.mkdir(newFoldName)
    #2获取old文件夹中所有的文件的名字
    fileNames=os.listdir(oldFolderName)
    print("当前文件列表%s"%fileNames)
    # print(os.listdir())
    #3.使用多进程方式,copy所有文件到新的文件夹中
    pool=Pool(5) #初始化进程池,最多容纳五个任务
    queue=Manager().Queue() #初始化队列,为了计算进度而用

    for name in fileNames:#拷贝的文件在文件夹里面
        #申请进程池空间,创建子进程任务,非堵塞apply_async申请
        pool.apply_async(copyFileTask,args=(name,oldFolderName,newFoldName,queue))

   # pool.close() 关闭进程池
   # pool.join() 进程池中的任务执行结束后再接着执行下面的代码

    num=0
    allnum=len(fileNames)
    print("当前文件夹的长度%d"%allnum)

    while True:
        
        queue.get() #出队列,能够出队列表示copy成功,队列不为空
        num +=1 #出一次队列,计数一次,为了计算进度
        copyRate=num/allnum
        #print("\r%.2f%%" %(copyRate*100), end='')
        print("\r复制copy进度条是:%.2f%%"%(copyRate*100),end="") #打印进度条
        if num==allnum:
            break
        print("=====已完成拷贝---")

if __name__=="__main__":
    main()

centos中的执行后结果:

[root@localhost ~]# python 多进程copy文件.py 
请输入文件夹的名字:python_xuexi
当前文件列表['hello.py', 'testa.py', '01-fork.py', '02-fork.py', '03-修改全局变量fork.py', '04-fork.py', '05-fork炸弹.py', '06_Process.py', '07_process_class.py', '08_pool.py', '09_pool.py']
当前文件夹的长度11
复制copy进度条是:9.09%=====已完成拷贝---
复制copy进度条是:18.18%=====已完成拷贝---
复制copy进度条是:27.27%=====已完成拷贝---
复制copy进度条是:36.36%=====已完成拷贝---
复制copy进度条是:45.45%=====已完成拷贝---
复制copy进度条是:54.55%=====已完成拷贝---
复制copy进度条是:63.64%=====已完成拷贝---
复制copy进度条是:72.73%=====已完成拷贝---
复制copy进度条是:81.82%=====已完成拷贝---
复制copy进度条是:90.91%=====已完成拷贝---
复制copy进度条是:100.00%[root@localhost ~]# cat 进
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值