欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程语言 > python >内容正文

python

PYTHON单任务FTP断点续传程序

发布时间:2023/12/18 python 48 豆豆
生活随笔 收集整理的这篇文章主要介绍了 PYTHON单任务FTP断点续传程序 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

自己写的单任务FTP断点续传程序,新创建的任务会存到日志文件中(可存储多个任务的日志),异常中断重启时可以选择指定任务继续下载。程序比较简单,也可以说比较简陋,有些问题并未细致的考虑,比如磁盘空间不足的情况。SO,仅是作为一个简单的学习例程(给自己,也给那些认为可以学习学习的朋友们,或许想偷懒的人还可以拿去简单的应用)!

 

myctrl.py#-*-encoding:gbk-*- #Author:没车步行 #Email:lu_zhouyu@hotmail.com #Edit:2009-4-7 #Copyright:转载请注明出处 import sys import base64 import shelve import myftplib import osshlfp='task.dat'class mytask:"""shlf:任务队列remoteip:远程服务器IP,默认localhostremoteport:远程服务器端口,默认21remotepath:远程服务器路径,默认根目录remotefilename:远程服务器文件,必填项localpath:本地路径,默认程序目录localfilename:本地文件,默认同远程服务器文件taskcode:任务代码,用于判断任务是否已存在,假设性条件无限制loginname:远程服务器登录名loginpassword:远程服务器登录密码"""shlf=shelve.open(shlfp)remoteip='localhost'remoteport='21'remotepath=localpath=''localfilename=remotefilename=''taskcode=''loginname=''loginpassword=''def __init__(self):self.printtask()def maketask(self,remotefilename,localfilename,**kwargs):self.remotefilename=remotefilenameif localfilename:self.localfilename=localfilenameelse:self.localfilename=remotefilenamefor k in kwargs.keys():v=kwargs[k]if k=='remoteip' and v!='':self.remoteip=velif k=='remoteport' and v!='':self.remoteport=velif k=='remotepath' and v!='':self.remotepath=velif k=='localpath' and v!='':self.localpath=velif k=='loginname' and v!='':self.loginname=velif k=='loginpassword' and v!='':self.loginpassword=vself.starttask()def removetask(self,taskid):del self.shlf[taskid]def starttask(self):taskid='1'if len(self.shlf):taskid=str(int(max(self.shlf.keys()))+1)taskval={}taskval['remoteip']=self.remoteiptaskval['remoteport']=self.remoteporttaskval['remotepath']=self.remotepathtaskval['remotefilename']=self.remotefilenametaskval['localpath']=self.localpathtaskval['localfilename']=self.localfilenametaskval['taskcode']=self.taskcodetaskval['loginname']=self.loginnametaskval['loginpassword']=self.loginpasswordself.shlf[taskid]=taskvalmyftplib.mywork(self.remoteip,self.remoteport,self.remotepath,self.remotefilename,self.localpath,self.localfilename,self.loginname,self.loginpassword,0)del self.shlf[taskid]self.shlf.close()def restarttask(self,taskid):taskval=self.shlf[taskid]remoteip=taskval['remoteip']remoteport=taskval['remoteport']remotepath=taskval['remotepath']remotefilename=taskval['remotefilename']localpath=taskval['localpath']localfilename=taskval['localfilename']loginname=taskval['loginname']loginpassword=taskval['loginpassword']myftplib.mywork(remoteip,remoteport,remotepath,remotefilename,localpath,localfilename,loginname,loginpassword,1)del self.shlf[taskid]self.shlf.close()def printtask(self):print '%-6s|%-15s|%s'%('任务ID','服务器地址','下载文件名')print '%s'%('-'*38)for t in self.shlf.keys():v=self.shlf[t]print '%-6s|%-15s|%s'%(t,v['remoteip'],v['remotefilename'])print ''if __name__=='__main__':mytask=mytask()if len(mytask.shlf):chk=raw_input('重新启动已存在的下载任务(Y-是/N-否):')if chk.strip().upper()=='Y':while 1:tid=raw_input('输入任务ID:')tid=tid.strip()if mytask.shlf.has_key(tid):mytask.restarttask(tid)breakprint '输入有误!',sys.exit()remoteip=raw_input("远程地址(localhost):")remoteip=remoteip.strip()remoteport=raw_input("远程端口(21):")remoteport=remoteport.strip()remotepath=raw_input("远程路径(默认为根目录):")remotepath=remotepath.strip()remotefilename=raw_input("远程文件名:")remotefilename=remotefilename.strip()loginname=raw_input("登录名:")loginname=loginname.strip()loginpassword=raw_input("登录密码:")loginpassword=loginpassword.strip()localfilename=raw_input("本地重命名(默认与远程文件同名):")localfilename=localfilename.strip()localpath=raw_input("本地路径(不存在自动创建):")localpath=localpath.strip()mytask.maketask(remotefilename,/localfilename,/remoteip=remoteip,/remoteport=remoteport,/remotepath=remotepath,/localpath=localpath,/loginname=loginname,/loginpassword=loginpassword)

 

myftplib.py#-*-encoding:gbk-*- #Author:没车步行 #Email:lu_zhouyu@hotmail.com #Edit:2009-4-7 #Copyright:转载请注明出处 from ftplib import FTP import os import sysclass MyFTP(FTP):#对FTP的继承#继承父类中的方法,在子类中可以直接调用#重载父类中retrbinary的方法def retrbinary(self, cmd, callback, fsize=0,rest=0):blocksize=1024cmpsize=restself.voidcmd('TYPE I')conn = self.transfercmd(cmd, rest)#此命令实现从指定位置开始下载,以达到续传的目的while 1:if fsize:print '/b'*30,'下载进度:%.2f%%'%(float(cmpsize)/fsize*100),data = conn.recv(blocksize)if not data:breakcallback(data)cmpsize+=blocksizeconn.close()return self.voidresp()def ConnectFTP(remoteip,remoteport,loginname,loginpassword):ftp=MyFTP()try:ftp.connect(remoteip,remoteport)except:return (0,'connect failed!')else:try:ftp.login(loginname,loginpassword)except:return (0,'login failed!')else:return (1,ftp)def mywork(remoteip,remoteport,remotepath,remotefilename,localpath,localfilename,loginname,loginpassword,reloadflag):res=ConnectFTP(remoteip,remoteport,loginname,loginpassword)if res[0]!=1:print res[1]sys.exit()ftp=res[1]ftp.set_pasv(0) #到这一部出现连接超时请偿试设置非0值if remotepath:#如果文件不在FTP根目录,则需要指定下一级目录ftp.cwd(remotepath)fsize=ftp.size(remotefilename)#获取远程文件大小print '目标文件大小:',fsizeif fsize==0:returnlocalfullpath=localfilenameif localpath:localfullpath=localpath+'/'+localfilenameif not os.path.exists(localpath):os.makedirs(localpath)if reloadflag and os.path.isfile(localfullpath):rest=os.stat(localfullpath).st_size#获取本地文件的大小if rest:if rest==fsize:print '远程文件大小与本地文件大小相同,删除任务!'returnprint '/b'*30,'已经下载:%.2f%%'%(float(rest)/fsize*100),raw_input('回车继续....')ftp.retrbinary('RETR '+remotefilename,open(localfullpath,'ab').write,fsize,rest)else:ftp.retrbinary('RETR '+remotefilename,open(localfullpath,'wb').write,fsize)print '完成文件大小:',os.stat(localfullpath).st_size

 

转载请注明出处 

总结

以上是生活随笔为你收集整理的PYTHON单任务FTP断点续传程序的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。