如何将文件列表与目标列表并行复制? Python
How to copy list of files in parallel to list of destinations? Python
我有 src_list
和 dst_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,这是行不通的。这是我能得到的最干净的。
我有 src_list
和 dst_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,这是行不通的。这是我能得到的最干净的。