多任务文件copy器

news/2024/7/7 15:03:35 标签: 多任务, 进程池

本项目实现从一个旧文件夹复制里面的文件到一个新文件夹,使用多进程实现。

基础版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()

 


http://www.niftyadmin.cn/n/944555.html

相关文章

Python实现正则表达式

1.匹配单个字符 import re# \d匹配一个数字 retre.match("速度与激情\d\d","速度与激情35") print(ret.group())# [12345678],[1-8]匹配1-8 retre.match("速度与激情[1-8]","速度与激情35") print(ret.group())# [1-8a-d]匹配数字…

Python实现HTTP服务器(一)

用户通过浏览器输入IP地址端口号,浏览器访问TCP服务器,使用网络调试助手可以看到,浏览器在与服务器连接时,会发送request请求,请求的数据如下 当服务器发送数据到浏览器时,response的数据如下 数据从服务器…

Python实现HTTP服务器(二)

承接上篇博客:https://blog.csdn.net/qq_32426313/article/details/104179965 1.建立一个TCP服务器 2.浏览器发送请求request 3.服务器发送response给浏览器 服务器代码如下: import socketdef service_client(new_socket):"""为这个…

Python实现HTTP服务器(三)返回指定的html页面

承接上文:https://blog.csdn.net/qq_32426313/article/details/104180402 通过前两篇博客我们可以了解,当在浏览器端输入127.0.0.1:7890时会发送request请求,格式为GET / HTTP/1.1,如果指定访问页面输入127.0.0.1:7890/index.html时request请…

Python实现HTTP服务器(四)线程、进程、协程实现多任务

承接上文:https://blog.csdn.net/qq_32426313/article/details/104192330 1.线程、进程实现多任务HTTP服务器 import re import socket import multiprocessing import threadingdef service_client(new_socket):"""为这个客户端返回数据"&qu…

Python实现HTTP服务器(五)单进程线程非阻塞实现多任务

承接上文:https://blog.csdn.net/qq_32426313/article/details/104204473 上篇博客使用了进程、线程、协程实现了多任务的HTTP服务器。本文使用非阻塞单线程进程实现多任务。 1.设置套接字为非阻塞状态 2.建立一个列表用来装交互的套接字 3.遍历列表&#xff0c…

Python实现HTTP服务器(六)长连接HTTP服务器

承接上文:https://blog.csdn.net/qq_32426313/article/details/104204568 HTTP长连接与短连接区别,参考https://www.jianshu.com/p/3fc3646fad80,一个网页中包含多个HTML,CSS,如果是短连接,访问一个页面时…

matplotlib+basemap画出标记地图

参考地址:https://mp.weixin.qq.com/s/Mni6ZLGC5jlUzMVpglv6JA https://www.cnblogs.com/ameile/p/6694982.html 1.首先建立一个字典用来存储每个省份的疫情状况,使用不同的颜色标记来区分 2.readshapefile为读取下载好的地图文件&#…