Python实现的多进程拷贝文件并显示百分比功能示例
本文实例讲述了Python实现的多进程拷贝文件并显示百分比功能。分享给大家供大家参考,具体如下:
centos7下查看cup核数:
#总核数=物理CPU个数X每颗物理CPU的核数 #总逻辑CPU数=物理CPU个数X每颗物理CPU的核数X超线程数 #查看物理CPU个数 cat/proc/cpuinfo|grep"physicalid"|sort|uniq|wc-l #查看每个物理CPU中core的个数(即核数) cat/proc/cpuinfo|grep"cpucores"|uniq #查看逻辑CPU的个数 cat/proc/cpuinfo|grep"processor"|wc-l
本示例拷贝文件采用的是最简单的但是有最复杂的方式:
1,根据要拷贝的文件夹名称,创建一个新的文件夹用来存储文件
2,读取源文件夹下的文件内容,将其写入目的文件夹下同名的文件中
直接上代码:
#coding=utf-8
frommultiprocessingimportPool,Manager
importos
importtraceback
importtime
defcopyFileTask(name,oldFolderName,newFolderName,queue):
"""copy文件"""
fr=open(oldFolderName+"/"+name)
fw=open(newFolderName+"/"+name,"w")
content=fr.read()
fw.write(content)
fr.close()
fw.close()
#将copy完成的文件名称put进队列
queue.put(name)
defmain():
try:
#0.获取要copy的文件夹
#oldFolderName=input("请输入文件夹的名字:")#python3
oldFolderName=raw_input("请输入文件夹的名字:")#python2
#1.创建一个新的文件夹
print'mkdirnewfile------'
newFolderName=str(oldFolderName)+"-copy"
#print(newFolderName)
os.mkdir(newFolderName)
#2.获取old文件夹中的所有的文件名字
fileNames=os.listdir(oldFolderName)
#print(fileNames)
#3.使用多进程的方式copy原文件夹中的所有文件到新的文件夹中
pool=Pool(5)
#创建一个队列
queue=Manager().Queue()
fornameinfileNames:
pool.apply_async(copyFileTask,args=(name,oldFolderName,newFolderName,queue))
pool.close()#关闭进程池,不再接受请求
pool.join()#等待所有的子进程结束
num=0
#需要copy的文件总数
allNum=len(fileNames)
whilenum
下面采用python模块shutil模块进行copy操作:
#coding=utf-8
frommultiprocessingimportPool,Manager
importos
importtraceback
importtime
importshutil
defcopyFileTask(name,old_path,new_path,queue):
"""copy文件"""
src_path=os.path.join(old_path,name)
dst_path=os.path.join(new_path,name)
shutil.copy(src_path,dst_path)#拷贝文件
#shitil.move(src_path,dst_path)#移动文件
#将copy完成的文件名称put进队列
queue.put(name)
defmain():
try:
#0.获取要copy的文件夹
oldFolderName=raw_input("请输入文件夹的名字:")
print'要拷贝的源文件夹:',oldFolderName
#1.创建一个新的文件夹
newFolderName=raw_input("请输入文件夹的名字:")
print'目标文件夹:',newFolderName
#获取当前所在的路径
now_path=os.getcwd()
print"当前所在路径:",now_path
old_path=os.path.join(now_path,oldFolderName)
print'源文件夹路径:',old_path
new_path=os.path.join(now_path,newFolderName)
print'目标文件夹路径:',new_path
ifnotos.path.exists(new_path):
os.mkdir(new_path)
#3.使用多进程的方式copy原文件夹中的所有文件到新的文件夹中
pool=Pool(5)#创建5条进程
queue=Manager().Queue()#创建一个队列
#遍历源文件夹
forroot,dirs,filesinos.walk(oldFolderName):
"""
root所指的是当前正在遍历的这个文件夹的本身的地址
dirs是一个list,内容是该文件夹中所有的目录的名字(不包括子目录)
files同样是list,内容是该文件夹中所有的文件(不包括子目录)
"""
print'源文件夹下的文件数量::',len(files)
s_t=time.time()
forfileinfiles:
pool.apply_async(copyFileTask,args=(file,old_path,new_path,queue))#向进程池中添加任务
pool.close()#关闭进程池,不再接受请求
pool.join()#等待所有的子进程结束
print'耗时:{}秒'.format(time.time()-s_t)
num=0
#需要copy的文件总数
allNum=len(files)
print'len(fileNames)=',allNum
whileTrue:
#收数据
#print'收数据------'
queue.get()
#print'queue.get()------',queue.get()
num+=1
copyRate=float(num)/allNum
#打印copy的进度
print"\rcopy的进度是:%.2f%%"%(copyRate*100),
ifnum==allNum:
break
print"\ncopysuccess------"
except:
traceback.print_exc()
if__name__=="__main__":
main()
输出:(由于我的cup核数为1核,在使用多进程的过程中,操作系统在轮询的时候,频繁的切换任务,浪费时间导致多进程比单进程耗时更长。)
[root@centos7mnt]#pythoncopy_file_test.py
请输入文件夹的名字:hdfs
要拷贝的源文件夹: hdfs
请输入文件夹的名字:test01
目标文件夹:test01
当前所在路径: /mnt
源文件夹路径: /mnt/hdfs
目标文件夹路径: /mnt/test01
源文件夹下的文件数量::8165
耗时:253.655323982秒
len(fileNames)= 8165
copy的进度是:100.00%
copysuccess------
单进程拷贝文件:
#coding=utf-8
fromQueueimportQueue
importos
importtraceback
importtime
importshutil
defcopyFileTask(name,old_path,new_path,queue):
"""copy文件"""
src_path=os.path.join(old_path,name)
dst_path=os.path.join(new_path,name)
shutil.copy(src_path,dst_path)#拷贝文件
#shitil.move(src_path,dst_path)#移动文件
#将copy完成的文件名称put进队列
queue.put(name)
defmain():
try:
#0.获取要copy的文件夹
oldFolderName=raw_input("请输入文件夹的名字:")
print'要拷贝的源文件夹:',oldFolderName
#1.创建一个新的文件夹
newFolderName=raw_input("请输入文件夹的名字:")
print'目标文件夹:',newFolderName
#获取当前所在的路径
now_path=os.getcwd()
print"当前所在路径:",now_path
old_path=os.path.join(now_path,oldFolderName)
print'源文件夹路径:',old_path
new_path=os.path.join(now_path,newFolderName)
print'目标文件夹路径:',new_path
ifnotos.path.exists(new_path):
os.mkdir(new_path)
queue=Queue()#创建一个队列
#遍历源文件夹
forroot,dirs,filesinos.walk(oldFolderName):
"""
root所指的是当前正在遍历的这个文件夹的本身的地址
dirs是一个list,内容是该文件夹中所有的目录的名字(不包括子目录)
files同样是list,内容是该文件夹中所有的文件(不包括子目录)
"""
print'源文件夹下的文件数量::',len(files)
s_t=time.time()
#调用函数拷贝文件
forfileinfiles:
copyFileTask(file,old_path,new_path,queue)
print'耗时:{}秒'.format(time.time()-s_t)
num=0
#需要copy的文件总数
allNum=len(files)
print'len(fileNames)=',allNum
whileTrue:
#收数据
#print'收数据------'
queue.get()
#print'queue.get()------',queue.get()
num+=1
copyRate=float(num)/allNum
#打印copy的进度
print"\rcopy的进度是:%.2f%%"%(copyRate*100),
ifnum==allNum:
break
print"\ncopysuccess------"
except:
traceback.print_exc()
if__name__=="__main__":
main()
输出:
[root@centos7mnt]#pythoncopy_file_test_dan.py
请输入文件夹的名字:hdfs
要拷贝的源文件夹: hdfs
请输入文件夹的名字:test02
目标文件夹:test02
当前所在路径: /mnt
源文件夹路径: /mnt/hdfs
目标文件夹路径: /mnt/test02
源文件夹下的文件数量::8165
耗时:122.284090996秒
len(fileNames)= 8165
copy的进度是:100.00%
copysuccess------
我的虚拟机cpu核数:1
如下:
[root@centos7mnt]#cat/proc/cpuinfo|grep"physicalid"|sort|uniq|wc-l
1
[root@centos7mnt]#cat/proc/cpuinfo|grep"cpucores"|uniq
cpucores:1
[root@centos7mnt]#cat/proc/cpuinfo|grep"processor"|wc-l
1
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python文件与目录操作技巧汇总》、《Python文本文件操作技巧汇总》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。