1. 程式人生 > >python 多進程拷貝文件目錄

python 多進程拷貝文件目錄

true 進程 wal makedirs ssi make 出現 man rgs

 1 # -*- coding: utf-8 -*-
 2 # @author: Tele
 3 # @Time  : 2019/04/02 下午 3:09
 4 # 借助shutil使用多進程拷貝文件夾
 5 # 使用進程池實現多進程時,使用的消息隊列要使用multiprocessing.Manager().Queue()創建
 6 
 7 import time
 8 import re
 9 import os
10 import shutil
11 import multiprocessing
12 
13 
14 # 遍歷文件夾
15 def walk_file(file):
16 file_list = list() 17 for root, dirs, files in os.walk(file): 18 # 遍歷文件 19 for f in files: 20 file_list.append(f) 21 return file_list 22 23 24 # 計算文件數量 25 def get_file_count(dir): 26 return len(walk_file(dir)) 27 28 29 def copy(src, target, queue):
30 target_number = 1 31 if os.path.isdir(src): 32 target_number = get_file_count(src) 33 shutil.copytree(src, target) 34 else: 35 shutil.copyfile(src, target) 36 # 將拷貝完成的文件數量放入隊列中 37 queue.put(target_number) 38 39 40 def copy_dir(src, desc): 41 total_number = get_file_count(src)
42 # 分隔符檢測 43 src = check_speator(src) 44 desc = check_speator(desc) 45 # print("src:",src) 46 # print("desc:",desc) 47 48 file_dir_list = [src + "/" + i for i in os.listdir(src)] 49 if os.path.exists(desc): 50 shutil.rmtree(desc) 51 pool = multiprocessing.Pool(3) 52 53 # 創建隊列 54 queue = multiprocessing.Manager().Queue() 55 56 # 一個文件/目錄開啟一個進程去拷貝 57 for f_name in file_dir_list: 58 target = desc + "/" + f_name[index_list("/", f_name)[1] + 1:] 59 # print(target) 60 # 創建target目錄 61 parent_path = os.path.split(target)[0] 62 if not os.path.exists(parent_path): 63 os.makedirs(parent_path) 64 pool.apply_async(copy, args=(f_name, target, queue,)) 65 66 start = time.time() 67 pool.close() 68 # pool.join() 69 count = 0 70 while True: 71 count += queue.get() 72 # 格式化輸出時兩個%輸出一個%,不換行,每次定位到行首,實現覆蓋 73 print("\r拷貝進度為 %.2f %%" % (count * 100 / total_number), end="") 74 if count >= total_number: 75 break 76 end = time.time() 77 print() 78 print("耗時-----", (end - start), "s") 79 80 81 # 查找指定字符出現的全部索引位置 82 def index_list(c, s): 83 return [i.start() for i in re.finditer(c, s)] 84 85 86 # 檢測目錄結尾是否有 "/" 87 def check_speator(path): 88 if path.rindex("/") == len(path) - 1: 89 return path[0:path.rindex("/")] 90 return path 91 92 93 def main(): 94 copy_dir("f:/ftp_mypc/", "e:/ftp_mypc/") 95 96 97 if __name__ == __main__: 98 main()

python 多進程拷貝文件目錄