Python 使用SFTP和FTP实现对服务器的文件下载功能
一、用ftplib模块连接远程服务器
ftplib模块常用方法
ftp登陆连接
fromftplibimportFTP#加载ftp模块
ftp=FTP()#设置变量
ftp.set_debuglevel(2)#打开调试级别2,显示详细信息
ftp.connect("IP","port")#连接的ftpsever和端口
ftp.login("user","password")#连接的用户名,密码
printftp.getwelcome()#打印出欢迎信息
ftp.cmd("xxx/xxx")#进入远程目录
bufsize=1024#设置的缓冲区大小
filename="filename.txt"#需要下载的文件
file_handle=open(filename,"wb").write#以写模式在本地打开文件
ftp.retrbinaly("RETRfilename.txt",file_handle,bufsize)#接收服务器上文件并写入本地文件
ftp.set_debuglevel(0)#关闭调试模式
ftp.quit()#退出ftp
ftp相关命令操作
ftp.cwd(pathname)#设置FTP当前操作的路径
ftp.dir()#显示目录下所有目录信息
ftp.nlst()#获取目录下的文件
ftp.mkd(pathname)#新建远程目录
ftp.pwd()#返回当前所在位置
ftp.rmd(dirname)#删除远程目录
ftp.delete(filename)#删除远程文件
ftp.rename(fromname,toname)#将fromname修改名称为toname。
ftp.storbinaly("STORfilename.txt",file_handel,bufsize)#上传目标文件
ftp.retrbinary("RETRfilename.txt",file_handel,bufsize)#下载FTP文件
ftplib模块封装调用
fromftplibimportFTP
fromcommon.logModuleimportLogClass
classFTPClass(LogClass):
"""
:FTP连接远程服务器下载文件
"""
def__init__(self,ftp_link,ftp_path=None):
"""
:连接ftp服务器
:paramftp_link:服务器ip,用户名,密码
:paramftp_path:ftp中的文件路径
"""
LogClass.__init__(self,logName='FTPClass')
self.ftp=FTP(ftp_link[0])#链接FTP
self.ftp.set_debuglevel(2)#设置调试等级
self.ftp.login(ftp_link[1],ftp_link[2])#输入用户名和密码
self.ftp.set_pasv(False)#False:主动模式True:被动模式
ifftp_path:
self.ftp.cwd(ftp_path)
defdownload_file(self,like_file_name,save_path,save_name=None):
"""
:下载文件并保存文件到本地,如果save_name为空则下载所有文件名称包含like_file_name的所有文件
:paramlike_file_name:需要下载的文件
:paramsave_path:文件保存路径
:paramsave_name:文件保存名称
:return:
"""
try:
ftp_files=self.ftp.nlst()#获取ftp当前目录下的所有文件名称
ifsave_name:#如果文件保存名称存在则只下载单一文件
fp=open(save_path+save_name,'wb')#以写模式在本地打开文件
self.ftp.retrbinary('RETR'+'ftp文件名',fp.write)#接收服务器上文件并写入本地文件
fp.close()#关闭文件
else:#如果文件保存名称则下载包含like_file_name的所有文件
forftp_fileinftp_files:
ifftp_file[-5:]=='.GRB2':
iflike_file_nameinftp_file:#如果文件名称中包含like_file_name
fp=open(save_path+ftp_file,'wb')#以写模式在本地打开文件
self.ftp.retrbinary('RETR'+ftp_file,fp.write)#接收服务器上文件并写入本地文件
fp.close()#关闭文件
self.ftp.quit()#关闭ftp连接
exceptException:
raise
if__name__=='__main__':
ftp_link=['ip','username','password']
ftp_path='/data/result/'
ftp=FTPClass(ftp_link,ftp_path)
like_file_name=".GRB2"
save_path='D:\\file\\'
ftp.download_file(like_file_name,save_path)
用paramiko模块连接远程服务器
paramiko模块常用方法
put(self,localpath,remotepath,callback=None,confirm=True) 参数说明: localpath:上传源文件的本地路径 remotepath:目标路径 callback:获取接收与总传输字节数 confirm:上传完毕后是否调用stat()方法,以便确认文件大小 get(self,remotepath,localpath,callback=None) 参数说明: remotepath:需要下载的远程文件 localpath:本地存储路径 callback:同put方法 mkdir:用于创建目录 remove:删除目录 rename:重命名 stat:获取文件信息 listdir:获取目录列表
paramiko模块封装调用
importos
importparamiko
fromstatimportS_ISDIR
fromcommon.logModuleimportLogClass
classSFTPClass(LogClass):
"""
:SFTP连接远程服务器下载文件
"""
def__init__(self,ftp_link,ftp_path=None,local_path=None):
"""
连接ftp服务器
"""
LogClass.__init__(self,logName='FTPProcess')
trans=paramiko.Transport((ftp_link[0],22))#连接ftp
trans.connect(username=ftp_link[1],password=ftp_link[2])#输入用户名和密码
self.sftp=paramiko.SFTPClient.from_transport(trans)
self.ftp_path=ftp_path#目标路径
self.local_path=local_path#保存路径
defsave_all_file_path(self,ftp_path):
"""保存所有文件的列表"""
all_files=list()
ifftp_path[-1]=='/':#去掉路径字符串最后的字符'/',如果有的话
ftp_path=ftp_path[0:-1]
files=self.sftp.listdir_attr(ftp_path)#获取当前指定目录下的所有目录及文件,包含属性值
foriinfiles:
filename=ftp_path+'/'+i.filename
ifS_ISDIR(i.st_mode):#如果是目录,则递归处理该目录,这里用到了stat库中的S_ISDIR方法
all_files.extend(self.save_all_file_path(filename))
else:
all_files.append(filename)
returnall_files
defdownload_file(self):
"""
下载文件并保存文件到本地
"""
try:
ifself.ftp_pathandself.local_path:
all_files=self.save_all_file_path(self.ftp_path)#保存所有文件的列表
forfileinall_files:
filename=file.split('/')[-1]
local_filename=os.path.join(self.local_path,filename)
self.logger.info(u'Duringfiledownload:%s'%filename)
self.sftp.get(file,local_filename)#下载到本地
else:
self.logger.error("ftp_pathorlocal_pathisnull")
return
exceptExceptionase:
self.logger.error(e)
if__name__=='__main__':
ftp_link=['ip','user','password']
ftp_path="/data/"
local_path="D:\\file\\"
f=SFTPClass(ftp_link,ftp_path=None,local_path=None)
f.download_file()
到此这篇关于Python使用SFTP和FTP实现对服务器的文件下载功能的文章就介绍到这了,更多相关Python实现服务器文件下载内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!