• python递归拷贝目录和线程拷贝目录


    单线程递归拷贝:

    import os
    from multiprocessing import Pool,Queue
    import time
    
    #记录拷贝次数
    num=0
    #拷贝文件
    def cp(type,cide):
        '''
        :param type: 拷贝文件
        :param cide: 目标文件(相对路径 )
        :return:
        '''
        global num
        with open(type,'rb') as cp:
            rb=cp.read()
            with open(cide,'wb') as down:
                down.write(rb)
                num+=1
                print('拷贝第%d个'%num)
        print(f"拷贝{type}>>>>>{cide}")
    
    
    
    #对目录以及目录内文件拷贝和递归创建目录
    def cp_mkdir(type,mkdir):
        """
        :param type: 被拷贝的目录
        :param mkdir: 拷贝到
        :return:
        """
        #深度
        #记录深度
        s=os.listdir(type)
        os.mkdir(mkdir)
        print(f"创建文件{mkdir}")
        for item in s:
            if '.' in item:
                #文件名递归拼接
                type_new=type+'/'+item
                mkdir_new=mkdir+'/'+item
                cp(type_new,mkdir_new)
            else:
                # 目录递归拼接
                type_new = type + '/' + item
                mkdir_new=mkdir+'/'+item
                cp_mkdir(type_new,mkdir_new)
    
    #文件拷贝入口
    if __name__ == '__main__':
        #记录时间
        down_time = time.time()
        #创建进程池
        pool = Pool()
        pool.apply_async(func=cp_mkdir, args=('img','img_new'))
    
        pool.close()
        pool.join()
    
        up_time = time.time()
        print(up_time - down_time)

    线程池循环单线程拷贝:

    """
    练习2 : 拷贝一个目录
    编写程序完成,将一个文件夹拷贝一份
    * 假设文件夹中只有普通文件
    * 将每个文件的拷贝作为一个拷贝事件
    * 使用进程池完成事件
    
    提示 : os.mkdir('name')
    """
    from multiprocessing import Pool,Queue
    import os,sys
    import time
    
    q = Queue() # 创建消息队列
    
    # 拷贝一个文件
    def copy(file,old_folder,new_folder):
        fr = open(old_folder+'/'+file,'rb')
        fw = open(new_folder+'/'+file,'wb')
        while True:
            data = fr.read(1024)
            if not data:
                break
            n = fw.write(data) # 写入多少就是拷贝多少
            q.put(n) # 放入消息队列
        fr.close()
        fw.close()
    
    # 获取文件夹大小
    def get_size(dir):
        total_size = 0
        for file in os.listdir(dir):
            total_size += os.path.getsize(dir+'/'+file)
        return total_size
    
    # 使用进程池
    def main():
        old_folder = input("你要拷贝的目录:")
        # 文件夹大小
        total_size = get_size(old_folder)
        new_folder = old_folder + "-备份"
        try:
            os.mkdir(new_folder)
        except:
            sys.exit("该目录已存在")
    
        # 创建进程池
        pool = Pool()
        # 遍历目录,确定要拷贝的文件
        for file in os.listdir(old_folder):
            pool.apply_async(func=copy,args=(file,old_folder,new_folder))
    
        copy_size = 0
        # while copy_size < total_size:
        #     copy_size += q.get() # 从消息队列获取数值累加
        #     print("拷贝了 %.2f%%"%(copy_size/total_size*100)
    
    
    
        pool.close()
        pool.join()
    
    if __name__ == '__main__':
        down_time = time.time()
        main()
        up_time = time.time()
        print(up_time-down_time)
  • 相关阅读:
    Java中List集合去除重复数据的六种方法
    常见的Redis面试"刁难"问题,值得一读
    以Integer类型传参值不变来理解Java值传参
    Linux系统安装snmp服务
    直接取数据到RANGE
    SAP翔子_2019集结号
    销售订单BOM组件分配(CP_BD_DIRECT_INPUT_PLAN_EXT)
    SAP翔子_webservice篇索引
    函数篇3 EXCEL导入函数去除行数限制
    ABAP基础篇4 常用的字符串操作语法
  • 原文地址:https://www.cnblogs.com/yongqi-wang/p/13295279.html
Copyright © 2020-2023  润新知