本项目实现从一个旧文件夹复制里面的文件到一个新文件夹,使用多进程实现。
基础版copy器具体步骤:
1.获取用户要copy的文件夹名称
2.创建一个新文件夹
3.获取旧文件夹中所有待copy的文件的名字
4.创建进程池
5.想进程池中添加copy文件的任务
import multiprocessing
import os
def copy_file(file_name,old_floder_name,new_floder_name):
print("--要拷贝的文件%s--从%s到%s"%(file_name,old_floder_name,new_floder_name))
# 打卡旧文件
old_f=open(old_floder_name+"/"+file_name,"rb")
content=old_f.read()
old_f.close()
# 创建新文件
new_f=open(new_floder_name+"/"+file_name,"wb")
new_f.write(content)
new_f.close()
def main():
# 1.获取用户要copy的文件夹的名字
old_floder_name=input("请输入要copy的文件夹的名字:")
# 2.创建一个新文件夹
try:
new_floder_name=old_floder_name+"[复件]"
os.mkdir(new_floder_name)
except:
pass
# 3.获取旧文件夹的所有的待copy的文件的名字 listdir()
file_names=os.listdir(old_floder_name)
print(file_names)
# 4.创建进程池
po=multiprocessing.Pool(5)
# 5.向进程池中添加copy文件的任务
for file_name in file_names:
po.apply_async(copy_file,args=(file_name,old_floder_name,new_floder_name))
po.close()
po.join()
if __name__ == '__main__':
main()
显示进度条版copy器
在基础版上增加队列Queue,子线程将已经完成copy的文件名入队,主线程则将文件名出队,实时统计完成copy的文件的个数
import multiprocessing
import os
def copy_file(q,file_name,old_floder_name,new_floder_name):
#print("--要拷贝的文件%s--从%s到%s"%(file_name,old_floder_name,new_floder_name))
# 打开旧文件
old_f=open(old_floder_name+"/"+file_name,"rb")
content=old_f.read()
old_f.close()
# 创建新文件
new_f=open(new_floder_name+"/"+file_name,"wb")
new_f.write(content)
new_f.close()
#如果copy完则进队
q.put(file_name)
def main():
# 1.获取用户要copy的文件夹的名字
old_floder_name=input("请输入要copy的文件夹的名字:")
# 2.创建一个文件夹
try:
new_floder_name=old_floder_name+"[复件]"
os.mkdir(new_floder_name)
except:
pass
# 3.获取文件夹的所有的待copy的文件的名字 listdir()
file_names=os.listdir(old_floder_name)
print(file_names)
# 4.创建进程池
po=multiprocessing.Pool(5)
# 5.创建队列
q=multiprocessing.Manager().Queue()
# 6.向进程池中添加copy文件的任务
for file_name in file_names:
po.apply_async(copy_file,args=(q,file_name,old_floder_name,new_floder_name))
po.close()
#po.join()
all_file_num=len(file_names) #测一下旧文件个数
copy_ok_num=0
while True:
file_name=q.get()
#print("已经完成copy:%s"%file_name)
copy_ok_num+=1
# 输出格式end=''不换行,前面加\r为换行回行首
# 已完成copy的文件除以总文件个数为进度百分比
print("\r拷贝的进度为:%.2f%%"%(copy_ok_num*100/all_file_num),end="")
# 如果copy完成的个数和之前测的一样多,主线程退出
if(copy_ok_num>=all_file_num):
break
if __name__ == '__main__':
main()