python中基於多工的檔案複製方法
阿新 • • 發佈:2019-01-04
網路程式設計中,使用多工實現檔案的複製是非常有必要的。下面將簡要介紹兩種基於多工的檔案複製實現方式。
1.下面實現的是使用佇列實現檔案的多工複製過程
import multiprocessing import os def copied_old_folder(q, old_folder_name): '''檔案複製放入佇列中''' file_infos = [] file_names = os.listdir("./" + old_folder_name) # 路徑可以用當前目錄中的資料夾名錶示,也可以在前面新增'./',表示當前目錄 for file_name in file_names: try: fr = open("./" + old_folder_name + '/' + file_name, "r") file_data = fr.read() file_infos.append((old_folder_name, file_name, file_data)) except Exception as e: print("%s檔案複製過程出現錯誤,錯誤原因是:%s" % (file_name, e)) else: print("%s檔案複製完成." % file_name) finally: fr.close() for file_info in file_infos: q.put(file_info) print("---所有檔案資料已經讀取並存儲到佇列中---") def copy_to_folder(q): '''複製資料到新資料夾中''' # 從對列中提取資料 count = 0 # 記錄檔案個數 while True: file_info = q.get() try: os.mkdir(file_info[0] + "[復件(佇列)]") except: pass try: fw = open("./" + file_info[0] + "[復件(佇列)]" + "/" + file_info[1], "w") fw.write(file_info[2]) count += 1 except Exception as e: print("%s檔案複製過程出現錯誤,錯誤原因是:%s" % (file_info[1], e)) finally: fw.close() if q.empty(): # 這裡不能使用get方法,因為在佇列中沒有資料的時候不會犯會值,而會堵塞等待 break print("---所有檔案共%d已經從佇列中複製到新資料夾中---" % count) def main(): # 多程序之間通過佇列完成程序間通訊 # 建立一個佇列 q = multiprocessing.Queue(10) old_folder_name = input("請輸入要複製的資料夾:") # 建立多個程序,將佇列的引用當作實參進行傳遞到裡面 # old_folder_name = input("請輸入要複製的資料夾:") # p1 = multiprocessing.Process(target=copied_old_folder, args=(q, old_folder_name)) # 必須在main中定義要複製的資料夾, # # 因為在程序中,個進成的執行是沒有關係的, p1 = multiprocessing.Process(target=copied_old_folder, args=(q, old_folder_name)) # 必須在main中定義要複製的資料夾, # 因為在程序中,個進成的執行是沒有關係的, p2 = multiprocessing.Process(target=copy_to_folder, args=(q,)) # 這裡的程序引數需要有佇列 p1.start() p2.start() if __name__ == "__main__": main()
2、下面實現的是使用程序池實現檔案的多工複製過程
import os import time import random import multiprocessing '''使用程序池複製檔案''' def copy_file(copy_file_name, folder_name, new_folder_name): '''完成檔案到複製''' t_start = time.time() try: fr = open("./" + folder_name + "/" + copy_file_name, "r") fw = open("./" + new_folder_name + "/" + copy_file_name, "w") try: print(">>>>>>%s檔案開始複製<<<<<<" % copy_file_name) file_content = fr.read() fw.write(file_content) # time.sleep(random.random()*2) t_stop = time.time() print(">>>>>>%s檔案複製完成,消耗時間為:%.2f<<<<<<" % (copy_file_name, (t_start - t_stop))) except Exception as e: print("%s檔案複製失敗,錯誤原因為:%s" % (copy_file_name, e)) except Exception as e: print("%s檔案開啟失敗,錯誤原因為:%s" % (folder_name, e)) finally: fw.close() fr.close() # print("這裡被執行===========================================") # 這裡會被執行 def main(): # 獲取使用者要copy的檔案 folder_name = input("請輸入要複製的資料夾:") count = 0 # 記錄檔案個數 # 建立一個新的資料夾 try: new_folder_name = folder_name + "[復件]" os.mkdir(folder_name + "[復件]") except: pass # 獲取資料夾的所有的待copy的檔案 listdir() file_names = os.listdir(folder_name) # 獲取資料夾中的所有檔案,以列表的形式返回 # 建立程序池 po = multiprocessing.Pool(5) # 向程序池中新增copy檔案的任務 for file_name in file_names: po.apply_async(copy_file, args=(file_name, folder_name, new_folder_name)) count += 1 # 複製原檔案中的檔案 print("-----start-----") po.close() # 關閉程序池,關閉後進程池將不再接收請求 po.join() # 等待所有子程序執行完畢,且必須在close()後面 print("一共複製%d個檔案." % count) print("-----end-----") if __name__ == "__main__": main() 上面的內容是兩種多工方式實現檔案複製的方法。歡迎指正,多多學習。