def download(self):
ftp = self.connect()
try:
size = ftp.size(filename=self.filename)
print "Total size of {filename} is {size}".format(filename=self.filename, size=size)
written_till_now = 0
def handle(bytes):
f.write(bytes)
print "written bytes: {}".format(bytes)
with open(self.filename, 'wb') as f:
ftp.retrbinary('RETR {}'.format(self.filename), handle)
except (socket.error, error_perm) as e:
raise DownloaderException("Error in downloading file {filename}: {message}".format(filename=self.filename, message=str(e)))
except EOFError as e:
print "file {filename} downloaded successfully".format(filename=self.filename)
我想跟踪我当前下载的数据量,然后为我下载的每个数据流做一些额外的操作。
我在handle
函数中创建了一个download
函数。
Python ftblip.retrbinary为给定的回调提供数据。在我的情况下handle
但不知何故它没有执行。
另外,我怀疑在嵌套函数方面我不理解变量的范围。在我的理解中,我可以在子范围内使用父范围中定义的变量,只要我不修改它们。但在这种情况下f
是一个对象而我不修改它而是调用它的方法{{1} }。如果我错过了什么,请纠正我。
答案 0 :(得分:1)
handle
函数无权访问作用域f
变量。相反,您可以将打开的文件直接传递给handle
。
def handle(fp, bytes):
fp.write(bytes)
print "written bytes: {}".format(bytes)
with open(self.filename, 'wb') as f:
ftp.retrbinary('RETR {}'.format(self.filename), lambda b: handle(f, b))