python进阶之利用多进程实现文件的拷贝

整个程序的流程可分为四步:

        第一步是提示用户输入要拷贝的文件夹;

        第二步是创建新文件夹;

        第三步是获取文件夹中所有文件的名字;

        最后一步是就是利用进程池创建进程完成复制。

具体的分析在程序中都有了,不再做过多的赘述。(注释掉的代码是用于编写过程中的测试语句)

#根据进程池和进程间通信实现文件拷贝

from multiprocessing import Pool,Manager
import os

#完成拷贝文件
def copyFile(fileName,oldFilesName,newFilesName,queue):
	"拷贝文件函数"
#	print('拷贝文件名字:%s'%fileName)
	queue.put(fileName)
	fr = open(oldFilesName+'/'+fileName)
	fw = open(newFilesName+'/'+fileName,'w')
	
	content = fr.read()
	fw.write(content)
#	print('----------over!-------------')
	fr.close()
	fw.close()
#	queue.put(fileName)  #这条语句放在这总会导致最后完成的那个子进程的文件无法存入队列,最终导致 程序实际上已经完成,但是不能终止!why?

#由于我在linux中运行,加之以前的一些文件因为某些操作的不当,产生了.swap和.idea文件,利用一个循环实现过滤,如果有其他的干扰文件也可以用同样的方法过滤
def solute(temp_data):
	temps=[]
	for temp in temp_data:
		if (temp.split('.')[-1] == swap or
			temp.split('.')[-1] == idea)
			continue
		else:
			temps.append(temp)
	return temps


def main():		

	#1、提示用户输入要拷贝的文件
	oldFilesName = input('请输入要拷贝的文件夹的名字:')

	#2、创建文件夹,存放被拷贝的文件  
	newFilesName = oldFilesName+'_cp'
	#print('新文件夹的名字:%s'%newFilesName) 
	os.mkdir(newFilesName)

	#2、获取元文件中的所有文件名字
	fileNames = os.listdir(oldFilesName)
#	print(fileNames)
	#过滤文件
	fileName = solute(fileNames)
#	print(fileNames)
	#4、使用多进程的方式copy原文件夹中的数据到新文件夹中
	pool = Pool(5)
	queue = Manager().Queue()
	for fileName in fileNames:
		pool.apply_async(copyFile,args=(fileName,oldFilesName,newFilesName,queue))
		
#	pool.close()
#	pool.join()
	count = 0
	allCounts = len(fileNames)
#	print(allCounts)
	while True:#用主进程来显示拷贝进度
		name_t=queue.get()
#		print(name_t)
		count += 1
#		print('count:%s'%count)
#		print('-----------------------------------')
		print('\r拷贝进度:%.2f%%'%((count/allCounts)*100),end='')
		if count==allCounts:
			print('\n--------over---------')
			break
if __name__=='__main__':
	main()


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值