Копирование файлов из каталога через многопроцессорность и shutil python - PullRequest
0 голосов
/ 11 июля 2020

shutil предоставляет один из простейших способов копирования файлов / папок из каталога в другой.

Простой способ сделать это:

# Source path
src = r'D:\source_path'  
# Destination path  
dest = r'C:\destination_path\new_folder'
# Copy the content of source to destination  
destination = shutil.copytree(src, dest) 

Проблема с выше он копирует каждый отдельный файл один за другим. И для каталога, содержащего тысячу файлов, и не говоря уже об одном на удаленном сервере, это становится трудным и требует много времени.

Реализация multiprocessing для этой задачи решит много боли и времени. Мне известно о базовом c использовании функций многопроцессорности, но я не знаю, как действовать дальше. Я бы подумал начать так:

import multiprocessing 
import os 

def copy_instance(): 
    # printing process id 
    destination = shutil.copytree(src, dest) 
  
if __name__ == "__main__": 
    # printing main program process id 
    print("ID of main process: {}".format(os.getpid())) 
  
    # creating processes 
    p1 = multiprocessing.Process(target=copy_instance) 
  
    # starting processes 
    p1.start() 

Но это ничего не решает в смысле применения каждого файла как отдельного прогона. Любая помощь, предложения или ссылки будут полезны.

Изменить: Также пробовал это, но не смог заставить его работать. Любое предложение.

import multiprocessing 
import os 
import shutil
  
def copy_instance(list): 
    dest = r'C:\destination_path\new_folder'
    destination = shutil.copytree(list, dest) 
    return destination
  
if __name__ == "__main__": 
    # input list 
    
    sec = r"D:\source_path"
    source = os.listdir(sec)
    list=[]
    for ith in range(len(source)):
        list.append(str(sec) + "\\" + str(source[ith]))
    # creating a pool object 
    p = multiprocessing.Pool() 
  
    # map list to target function 
    result = p.map(copy_instance, list) 
  
    print(result) 

1 Ответ

0 голосов
/ 12 июля 2020

То, что вы закодировали, не решает проблему, потому что вы неправильно используете многопроцессорность. Последние две строки просто создают один процесс для копирования файлов, и он работает так, как будто вы ничего не делали, я имею в виду, как если бы вы не использовали многопроцессорность, поэтому вам нужно создать несколько процессов для копирования файлов. и одним из решений может быть создание одного процесса для каждого файла, и для этого вам нужно будет добавить несколько шагов и прекратить использование copytree следующим образом:

import shutil
import multiprocessing 
import os

def copy_instance(file): 

    # printing process id to SHOW that we're actually using MULTIPROCESSING 
    print("ID of main process: {}".format(os.getpid()))     

    shutil.copy(f'{src}\{file}', f'{dest}/') 

if __name__ == "__main__": 

    files = os.listdir(src) # Getting the files to copy

    for file in files:
        # creating a process per file 
        p1 = multiprocessing.Process(target=copy_instance, args=(file, )) 

        # starting processes 
        p1.start() 

Убедитесь, что у вас есть разрешение на копирование в dest и попробуйте использовать absolute path как для исходного, так и для целевого каталога

...