将不同SFTP目录下的多个文件下载到本地



我有一个场景,我们需要下载某些图像文件在SFTP服务器的不同目录到本地。

Example : 
/IMAGES/folder1 has img11, img12, img13, img14
/IMAGES/folder2 has img21, img22, img23, img24
/IMAGES/folder3 has img31, img32, img33, img34
And I need to download img12, img23 and img34 from folder 1, 2 and 3 respectively

现在我进入每个文件夹并单独获取图像,这需要花费非常多的时间(因为有10,000张图像需要下载)。

我还发现下载相同大小的单个文件(如多个图像文件)只需要一小部分时间。

我的问题是,有没有办法把这些文件放在一起,而不是一个接一个地下载它们?

我想到的一种方法是将所有文件复制到sftp服务器的临时文件夹中,然后下载该目录,但sftp不允许"复制",我不能使用"重命名",因为那样我会将文件移动到临时目录

您可以使用进程池打开多个sftp连接并并行下载。例如,

from paramiko import SSHClient
from multiprocessing import Pool
def download_init(host):
global client, sftp
client = SSHClient()
client.load_system_host_keys()
client.connect(host)
sftp = ssh_client.open_sftp()
def download_close(dummy):
client.close()
def download_worker(params):
local_path, remote_path = *params
sftp.get(remote_path, local_path)
list_of_local_and_remote_files = [
["/client/files/folder1/img11", "/IMAGES/folder1/img11"],
]
def downloader(files):
pool_size = 8
pool = Pool(8, initializer=download_init, 
initargs=["sftpserver.example.com"])
result = pool.map(download_worker, files, chunksize=10)
pool.map(download_close, range(pool_size))
if __name__ == "__main__":
downloader(list_of_local_and_remote_files)

不幸的是,Pool没有一个终结器来撤销在初始化器中设置的内容。这通常不是必需的——退出的过程已经足够清理了。在这个例子中,我只是写了一个单独的工作函数来清理这些东西。通过每个池进程有一个工作项,它们每个都得到一个调用。

相关内容

  • 没有找到相关文章

最新更新