如何将文件列表与目标列表并行复制? Python

How to copy list of files in parallel to list of destinations? Python

我有 src_listdst_list,两个长度相同的列表。

src_list 包含现有文件的路径。

dst_list 包含可能要覆盖的现有文件的路径(不是文件夹!)。

src_list[i]应该对应dst_list[i].

我想将每个 src_list[i] 复制到 dst_list[i],并行(多处理,而不是线程)。

我希望调用是阻塞的,这意味着在继续之前应该加入所有进程。


列表示例:

src_list = [

r"/data/one/f1.txt",
r"/data/one/f2.txt",
r"/data/two/f3.txt",
r"/data/three/f4.txt",
r"/data/four/five/f5.txt",
]

dst_list = [

r"/out1/f1.txt",
r"/out2/two/three/pook.txt",
r"/data/foo/bar/baz/f333.txt",
r"/kiko/f4",
r"/data/four/five/f5.txt",
]

真的,只是文件的路径。请假设列表的长度约为 1000-5000 个元素。


我似乎缺少的是正确的 API 调用来并行化两个可迭代对象。

from concurrent.futures import ProcessPoolExecutor
from shutil import copyfile

with ProcessPoolExecutor() as executor:
    executor.map(copyfile, src_list, dst_list)

如果你想限制正在处理这个的进程的数量,你可以在 ProcessPoolExecutor() 方法中传递一个 max_workers 参数。

你可以尝试类似的方法:

from multiprocessing import Process
import shutil

def parallel_copy(src_lst, dst_list):
    if not src_lst or not dst_list or len(src_lst) != len(dst_list):
        raise ValueError('Cannot process inputs.')

    processes = [Process(target=shutil.copyfile, args=(src, dst)) for src, dst in zip(src_lst, dst_list)]
    [p.start() for p in processes]
    [p.join() for p in processes]

完整答案,基于 。如果需要,这一个还会创建 dst 文件夹结构。

from concurrent.futures import ProcessPoolExecutor
import shutil 
from typing import Iterable


def copy_single_file_create_dirs(src, dst):
    os.makedirs(os.path.dirname(dst), exist_ok=True)
    shutil.copyfile(src, dst)


def copy_src_to_dst_overwrite_parallel(
        existing_src_files: Iterable[str],
        dst_files: Iterable[str],
        max_workers=None,
):
    with ProcessPoolExecutor(max_workers=max_workers) as executor:
        executor.map(copy_single_file_create_dirs, existing_src_files, dst_files)

copy_single_file_create_dirs 函数不能被定义为内部函数,因为它需要被 pickle,这是行不通的。这是我能得到的最干净的。