我有一个远程文件位置和本地路径的大列表,我希望它们最终到达。每个文件都很小,但其中有很多。我在Python中生成这个列表。
我想在解压缩和处理它们之前尽快(并行)下载所有这些文件。我使用的最佳库或linux命令行实用程序是什么?我尝试使用multiprocessing.pool实现这一点,但这不适用于FTP库。
我查看了pycurl,这似乎是我想要的,但我无法让它在Windows 7 x64上运行。
答案 0 :(得分:0)
答案 1 :(得分:0)
我通常使用pscp
来执行此类操作,然后使用subprocess.Popen
例如:
pscp_command = '''"c:\program files\putty\pscp.exe" -pw <pwd> -p -scp -unsafe <file location on my linux machine including machine name and login, can use wildcards here> <where you want the files to go on a windows machine>'''
p = subprocess.Popen( pscp_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE )
stdout, stderr = p.communicate()
p.wait()
当然我假设linux - &gt;窗
答案 2 :(得分:0)
如果您使用multiprocessing
模块中的Pool
对象,urllib2
应该处理FTP。
results = {}
def get_url(url):
try:
res = urllib2.urlopen(url)
# url should start with 'ftp:'
results[url] = res.read()
except Exception:
# add more meaningful exception handling if you need it. Eg, retry once etc.
results[url] = None
pool = Pool(processes=num_processes)
result = pool.map_async(get_url, url_list)
pool.close()
pool.join()
当然,产卵过程会产生一些严重的开销。如果您可以使用像twisted
这样的第三方模块,那么非阻塞请求几乎肯定会更快开销是否是严重问题将取决于每个文件的下载时间和网络延迟的相对大小。
您可以尝试使用python线程而不是进程来实现它,但它有点棘手。请参阅this question的答案,以便在线程中安全地使用urllib2。您还需要使用multiprocessing.pool.ThreadPool
而不是常规Pool
答案 3 :(得分:0)
知道它是一个老帖子但是有一个完美的linux实用程序。如果要从远程主机传输文件,lftp
非常棒!我主要使用它来快速将东西推送到我的ftp服务器,但它也很适合使用mirror
命令来删除东西。它还可以选择按照您的需要并行复制用户定义的文件数。如果要将某些文件从远程路径复制到本地路径,则命令行应如下所示;
lftp
open ftp://user:password@ftp.site.com
cd some/remote/path
lcd some/local/path
mirror --reverse --parallel=2
但是要非常小心这个命令,就像其他镜像命令一样,如果你搞砸了,你就会删除文件。
有关lftp
的更多选项或文档,我访问了此网站http://lftp.yar.ru/lftp-man.html