1. 程式人生 > 實用技巧 >python遞迴拷貝目錄和執行緒拷貝目錄

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)