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)

 

posted @ 2020-07-13 19:51  永琪  阅读(54)  评论(0编辑  收藏
原创版权,有违必究。