- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经搜索了几天,但还没有找到答案。
我尝试从 FTP 下载视频文件,我的脚本检查服务器,将 nlist() 与从文本文件解析的已下载文件列表进行比较,然后创建一个新的文件列表以获取并迭代它下载每个文件,断开与服务器的连接并重新连接下一个文件(我认为服务器超时可能是一个问题所以我在每次文件下载后退出()连接)。
这适用于前几个文件,但一旦我找到一个超过 5 分钟的文件,fitlib 就会在传输结束时挂起(我可以在资源管理器中看到文件大小正确,因此下载已经完成,但它似乎没有收到消息并转到下一个文件)
任何帮助将不胜感激,我的代码如下:
newPath = "Z:\\pathto\\downloads\\"
for f in getFiles:
print("Getting " + f)
for f in getFiles:
fil = f.rstrip()
ext = os.path.splitext(fil)[1]
if ext in validExtensions:
print("Downloading new file: " + fil)
downloadFile(fil, newPath)
这里是download.py
from ftplib import FTP
def downloadFile(filename, folder):
myhost = 'host'
myuser = 'user'
passw = 'pass'
#login
ftp = FTP(myhost,myuser,passw)
localfile = open(folder + filename, 'wb')
ftp.retrbinary("RETR " + filename, localfile.write, 1024)
print("Downloaded " + filename)
localfile.close()
ftp.quit()
最佳答案
没有更多信息,我实际上无法调试您的问题,所以我只能建议最笼统的答案。这对您来说可能不是必需的,但对任何人来说可能就足够了。
retrbinary
将阻塞直到整个文件完成。如果超过 5 分钟,则在整个 5 分钟内不会通过控制 channel 发送任何内容。您的客户端正在超时控制 channel ,或者服务器正在超时。因此,当您尝试使用 ftp.quit()
挂断时,它要么永远挂起,要么引发异常。
您可以使用 FTP
上的 timeout
参数来控制您一方的超时构造函数。某些服务器支持 IDLE
命令以允许您设置服务器端超时。但是,即使合适的超时被证明是可行的,您如何首先选择合适的超时?
您真正想要做的是防止控制套接字在数据套接字上发生传输时超时。但是怎么办?例如,如果您经常在回调函数中使用 ftp.voidcmd('NOOP')
,这就足以保持连接处于事件状态……但它也会迫使您阻塞,直到服务器响应 NOOP
,许多服务器在数据传输完成之前不会执行此操作,这意味着您将永远阻塞(或直到不同的超时)并且无法获取数据。
处理两个套接字而不阻塞另一个套接字的标准技术是多路复用器,如 select.select
或线程。您可以在此处执行此操作,但您将不得不放弃使用简单的 retrbinary
接口(interface),而是使用 transfercmd
显式获取数据套接字。
例如:
def downloadFile(…):
ftp = FTP(…)
sock = ftp.transfercmd('RETR ' + filename)
def background():
f = open(…)
while True:
block = sock.recv(1024*1024)
if not block:
break
f.write(block)
sock.close()
t = threading.Thread(target=background)
t.start()
while t.is_alive():
t.join(60)
ftp.voidcmd('NOOP')
另一种解决方案是一次读取 20MB,然后调用 ftp.abort()
,并使用 rest
参数恢复传输每个新的 retrbinary
直到到达文件末尾。然而,ABOR
可能会永远挂起,就像 NOOP
一样,所以这并不能保证任何事情——更不用说服务器不必响应它了。
您可以 做的只是关闭整个连接(不是退出
,而是关闭
)。这对服务器来说不是很好,并且可能会导致重新发送一些浪费的数据,并且如果您过快地终止套接字,也可能会阻止 TCP 正常加速到全速。但它应该有效。
参见 this answer — 请注意,它需要针对您的特定损坏的服务器进行一些测试,以确定哪些变体(如果有的话)可以正确有效地工作。
关于Python:ftplib 在传输结束时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19692739/
我想知道是否有人观察到使用 Python 的 ftplib 通过 ftp 下载或上传文件所花费的时间与通过 Windows 命令提示符或使用 Perl 执行 FTP get/put 相比非常长Net:
我正在使用 ftplib 在 Python 中下载文件,直到最近一切似乎都运行良好。我正在下载这样的文件: ftpSession = ftplib.FTP(host,username,password
通过 FTP 访问远程服务器时出现以下错误。不确定它有什么问题,所以我可以解决。任何线索都会有所帮助。 代码: import ftplib from ftplib import FTP ftp = f
我有一些远程文件: ___________ [somevar] Test: 2 ___________ 例如,我想将 var "Test"更改为 3,这样我将拥有: ___________ [some
我正在尝试使用 ftplib 在服务器上放置一个文件,但我遇到了一些我不知道如何处理的错误。登录有效,但尝试上传文件输出错误。这是我正在使用的代码: import ftplib import os d
我正在用 Python 编写测试工具,作为测试的一部分,我需要初始化 FTP 服务器并上传各种文件。我正在使用 ftplib,一切正常。我遇到的唯一问题是我在控制台窗口中看到大量 FTP 文本与我的测
当我从 iPython 0.13 运行这段代码时: import ftplib f=ftplib.FTP('ftp://ftp.ncbi.nih.gov/genomes/Bacteria/') 我收到
我知道如何设置下载这样的文件,但大多数文件都没有命名为 file-LATEST。我怎样才能下载最新的文件? 通过: 修改日期 时间戳 if version.current < version.new
手册说 To download a file, use ftp.retrlines('RETR ' + filename) 这是我的做法: ftp.retrbinary('RETR media/bac
这个问题已经有答案了: Cannot list FTP directory using ftplib – but FTP client works (1 个回答) 已关闭 4 年前。 我正在使用 py
我有一个 python 程序,它基本上只是在远程 FTP 服务器和本地计算机之间移动文件。我有一些代码可以删除 FTP 站点上的文件,类似于 try: ftplib_obj.delete(so
尝试使用 ftplib 连接到 ftp 服务器时,我遇到了一些非常奇怪的行为。我正在做的是: import ftplib ftp = ftplib.FTP('my-ftp-server') ftp.l
我用谷歌搜索,但我只能找到如何上传一个文件...我正在尝试将所有文件从本地目录上传到远程 ftp 目录。有什么想法可以实现吗? 最佳答案 用循环? 编辑:在一般情况下,仅上传文件将如下所示: im
我已经搜索了几天,但还没有找到答案。 我尝试从 FTP 下载视频文件,我的脚本检查服务器,将 nlist() 与从文本文件解析的已下载文件列表进行比较,然后创建一个新的文件列表以获取并迭代它下载每个文
我正在使用 ftplib 传输文件。一切都很好。现在我试图在下载之前获取目标文件的大小。 首先,我尝试使用 ftp.size(filename) 获取大小。服务器提示我不能在 ascii 模式下执行此
我正在尝试使用 ftplib 获取文件列表并下载自上次检查以来的任何新文件。到目前为止我尝试运行的代码是: #!/usr/bin/env python from ftplib import FTP i
如何使用 ftplib 检查远程 ftp 上的文件是否为文件夹? 我现在最好的方法是做一个 nlst,并在每个文件上迭代调用大小,如果文件出错那么它是一个文件夹? 有没有更好的方法?我无法解析列表的输
我想用 Python 的 ftplib 客户端指定端口(而不是默认端口 21)。 代码如下: from ftplib import FTP ftp = FTP('localhost') # conne
我的 Centos 服务器上有 pyftpdlib 0.7.0,我在客户端上使用 ftplib 当我尝试运行此命令时,我收到此错误 客户端操作系统:Windows 7 python V:2.7 服务器
我正在尝试从ftplib.all_errors中提取有用的错误消息,正在捕获550 /dir.: No such file or directory,但我想隔离出它是错误的文件还是错误的目录。到目前为
我是一名优秀的程序员,十分优秀!