首页 > 解决方案 > Python将大量文件错误复制到许多打开的文件

问题描述

我正在尝试将大量文件从一个目录复制到另一个目录。但是,在尝试通过使用线程来加快进程时,我收到一个错误,它抱怨打开的文件太多。目前测试批次的文件大约是 700+,下面是代码。我该如何解决?在我的示例中,我将文件从网络上的一个位置复制到同一网络上的另一个位置,文件范围从 1mb 到 100mb。

def copy_file_to_directory(file, directory):
    '''
    Description:
        Copies the file to the supplied directory if it exists
    '''
    if os.path.isfile(file):
        url = os.path.join(directory, os.path.basename(file))
        try:
            shutil.copyfile(file, url)
            shutil.copystat(file, url)
            return True
        except IOError as e:
            print (e)
            return False

def copy_files_to_directory(files, directory):
    '''
    Directory:
        Copy a list of files to directory, overwriting existing files
    '''
    if not os.path.isdir(directory):
        os.makedirs(directory)

    if not os.path.isdir(directory):
        return False

    workers = []   
    for x in files:
        if os.path.isfile(x):
            worker = threading.Thread(target=copy_file_to_directory, args=(x,directory))
            workers.append(worker.start())

    # wait until they are all done processing
    for x in workers:
        x.join()

    return True

 files = [] # list of files
 copy_files_to_directory(files, 'C:/Users/John')

标签: python

解决方案


您几乎肯定不希望每个文件产生一个线程。就线程给您带来好处的程度而言(无论如何您不只是使磁盘 I/O 带宽饱和),您可能应该只使用具有固定数量线程的线程池(例如 concurrent.futures.ThreadPoolExecutor)。这将限制一次打开的文件数量。事实上,这种情况在 Python 文档中作为示例给出:https ://docs.python.org/dev/library/concurrent.futures.html#concurrent.futures.Executor.shutdown

调整它以适应您的使用:

with ThreadPoolExecutor(max_workers=4) as e:
    for x in files:
        if os.path.isfile(x):
            e.submit(copy_file_to_directory, x, directory)

推荐阅读