shutil
提供了复制文件/文件夹的最简单方法之一从一个目录到另一个目录。
一个简单的方法是:
# Source path
src = r'D:source_path'
# Destination path
dest = r'C:destination_pathnew_folder'
# Copy the content of source to destination
destination = shutil.copytree(src, dest)
上面的问题是它一个接一个地复制每个单独的文件。对于包含一千个文件的目录,以及在远程服务器中的一个文件,这将变得困难和耗时。
将multiprocessing
应用于此任务将解决大量的痛苦和时间。我知道多处理功能的基本用法,但不知道如何进行。我想这样开始:
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_pathnew_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)
您编码的内容并不能解决问题,因为您没有正确使用多处理。最后两行只是创建一个复制文件的进程,它的工作方式就像你什么都没做一样,我的意思是,就好像你没有使用多处理一样,所以你必须创建多个进程来复制文件,一个解决方案可以是每个文件创建一个进程,要做到这一点,你必须添加一些步骤,并停止使用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
用于源目录和目标目录