zoukankan      html  css  js  c++  java
  • 文件拷贝器之多进程

    import os
    import multiprocessing
    import time,random
    
    """
    文件拷贝器
    1.取得源文件
    2.直接命名目标文件夹,在原文件加[副本]
    3.创建目标文件将爱
    4.取得要拷贝的文件夹中的所有文件名
    5.通过进程池去执行每一个文件拷贝任务
    6.准备一个还是你好俗,实现文件拷贝任务
    7.关闭进程池
    8.执行完进程池中的所有任务
    9.显示拷贝进度
    """
    def copy_file(source_files_name,dest_file_name,file_name,queue):
        # 1.打开源文件
        # 文件夹/文件
        read_file=open(source_files_name+'/'+file_name,"rb")
        # 2.创建或者打开目标文件
        write_file=open(dest_file_name+"/"+file_name,"wb")
    
        # 3.循环读写数据
        while True:
            time.sleep(random.random())
            content=read_file.read()
            if content:
                write_file.write(content)
            else:
                break
    
        # 关闭文件
        read_file.close()
        write_file.close()
    
        # 文件拷贝完了,将拷贝完的文件名发送到队列中
        queue.put(file_name)
    
    #   显示拷贝进度
    def copy_cate(file_names,queue):
        # 1.取得要拷贝文件的总数
        total_nums=len(file_names)
    
        # 当前拷贝的文件数
        copyed_nums=0
        # 2.不断取得拷贝完的文件名
        while True:
            copy_file_name = queue.get()
            copyed_nums +=1
        # 3.不断显示拷贝进度
            rate=copyed_nums/total_nums*100
            print("
    正拷贝完的文件%s,当前的拷贝进度%0.2f%%"%(copy_file_name,rate),end='')
            # r若文件拷贝完成
            if copyed_nums == total_nums:
                break
    
    def main():
        # 文件路径
        root_path="E:Python复习"
        # 1.取得源文件夹
        source_files_name = root_path+input("请输入要拷贝的文件夹:")
        # 2.直接命名目标文件夹,在源文件夹夹[副本]
        dest_files_name=source_files_name+'[副本]'
        # 3.创建文件夹
        try:
            os.mkdir(dest_files_name)
        except:
            pass
    
        # 4.取得要拷贝的文件夹的所有文件名
        file_names=os.listdir(source_files_name)
        # 5.通过进程池去执行每一个文件拷贝任务
        # 创建队列
        queue=multiprocessing.Manager().Queue()
        # 创建进程池
        pool=multiprocessing.Pool()
        # 遍历文件列表
        for file_name in file_names:
            pool.apply_async(func=copy_file,args=(source_files_name,dest_files_name,file_name,queue))
    
        # 关闭进程池
        pool.close()
    
        # 阻塞进程
        # pool.join()
    
        # 显示拷贝进度
        copy_cate(file_names,queue)
    
    if __name__ == '__main__':
        main()
  • 相关阅读:
    订餐系统
    throw和throws
    CF999E Solution
    CF1142B Solution
    CF965C Solution
    CF963B Solution
    CF999F Solution
    CF975D Solution
    CF997B Solution
    hdu 2553 N皇后
  • 原文地址:https://www.cnblogs.com/xiaolu915/p/10517004.html
Copyright © 2011-2022 走看看