python遞迴拷貝目錄和執行緒拷貝目錄
阿新 • • 發佈:2020-07-13
單執行緒遞迴拷貝:
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)