Python 使用SFTP和FTP实现对服务器的文件下载功能


Posted in Python onDecember 17, 2020

一、用 ftplib 模块连接远程服务器

ftplib模块常用方法

ftp登陆连接
from ftplib import FTP  #加载ftp模块
ftp=FTP()    #设置变量
ftp.set_debuglevel(2)  #打开调试级别2,显示详细信息
ftp.connect("IP","port")  #连接的ftp sever和端口
ftp.login("user","password") #连接的用户名,密码
print ftp.getwelcome()  #打印出欢迎信息
ftp.cmd("xxx/xxx")  #进入远程目录
bufsize=1024   #设置的缓冲区大小
filename="filename.txt"  #需要下载的文件
file_handle=open(filename,"wb").write #以写模式在本地打开文件
ftp.retrbinaly("RETR filename.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("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件

ftplib模块封装调用

from ftplib import FTP
from common.logModule import LogClass


class FTPClass(LogClass):
 """
 :FTP连接远程服务器下载文件
 """

 def __init__(self, ftp_link, ftp_path=None):
 """
 :连接ftp服务器
 :param ftp_link: 服务器ip, 用户名, 密码
 :param ftp_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:被动模式
 if ftp_path:
  self.ftp.cwd(ftp_path)

 def download_file(self, like_file_name, save_path, save_name=None):
 """
 :下载文件并保存文件到本地,如果save_name为空则下载所有文件名称包含like_file_name的所有文件
 :param like_file_name: 需要下载的文件
 :param save_path : 文件保存路径
 :param save_name: 文件保存名称
 :return:
 """
 try:
  ftp_files = self.ftp.nlst() # 获取ftp当前目录下的所有文件名称
  if save_name: # 如果文件保存名称存在则只下载单一文件
  fp = open(save_path + save_name, 'wb') # 以写模式在本地打开文件
  self.ftp.retrbinary('RETR ' + 'ftp文件名', fp.write) # 接收服务器上文件并写入本地文件
  fp.close() # 关闭文件
  else: # 如果文件保存名称则下载包含like_file_name的所有文件
  for ftp_file in ftp_files:
   if ftp_file[-5:] == '.GRB2':
   if like_file_name in ftp_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 连接
 except Exception:
  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模块封装调用

import os
import paramiko
from stat import S_ISDIR
from common.logModule import LogClass
class SFTPClass(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 # 保存路径

 def save_all_file_path(self, ftp_path):
 """保存所有文件的列表"""
 all_files = list()
 if ftp_path[-1] == '/': # 去掉路径字符串最后的字符'/',如果有的话
  ftp_path = ftp_path[0:-1]
 files = self.sftp.listdir_attr(ftp_path) # 获取当前指定目录下的所有目录及文件,包含属性值
 for i in files:
  filename = ftp_path + '/' + i.filename
  if S_ISDIR(i.st_mode): # 如果是目录,则递归处理该目录,这里用到了stat库中的S_ISDIR方法
  all_files.extend(self.save_all_file_path(filename))
  else:
  all_files.append(filename)
 return all_files

 def download_file(self):
 """
 下载文件并保存文件到本地
 """
 try:
  if self.ftp_path and self.local_path:
  all_files = self.save_all_file_path(self.ftp_path) # 保存所有文件的列表
  for file in all_files:
   filename = file.split('/')[-1]
   local_filename = os.path.join(self.local_path, filename)
   self.logger.info(u'During file download: %s' % filename)
   self.sftp.get(file, local_filename) # 下载到本地
  else:
  self.logger.error("ftp_path or local_path is null")
  return
 except Exception as e:
  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 实现服务器文件下载内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python实现测试磁盘性能的方法
Mar 12 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
Python 编码规范(Google Python Style Guide)
May 05 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
Python爬虫包BeautifulSoup异常处理(二)
Jun 17 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
Django给admin添加Action的步骤详解
May 01 Python
python 中pyqt5 树节点点击实现多窗口切换问题
Jul 04 Python
对django 模型 unique together的示例讲解
Aug 06 Python
python如何写出表白程序
Jun 01 Python
numpy数据类型dtype转换实现
Apr 24 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
Dec 17 #Python
python使用smtplib模块发送邮件
Dec 17 #Python
python实现计算器简易版
Dec 17 #Python
利用Python实现自动扫雷小脚本
Dec 17 #Python
用python读取xlsx文件
Dec 17 #Python
Python实现自动整理文件的脚本
Dec 17 #Python
Python用access判断文件是否被占用的实例方法
Dec 17 #Python
You might like
ninety plus是什么?ninety plus咖啡好吗?
2021/03/04 新手入门
如何使用Strace调试工具
2013/06/03 PHP
PHP5.3新特性小结
2016/02/14 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
Nigma vs Liquid BO3 第一场2.14
2021/03/10 DOTA
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
JS 在指定数组中随机取出N个不重复的数据
2014/06/10 Javascript
Javascript获取CSS伪元素属性的实现代码
2014/09/28 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
深入了解JavaScript中的Symbol的使用方法
2015/07/28 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
JavaScript 不支持 indexof 该如何解决
2016/03/30 Javascript
JavaScript Ajax编程 应用篇
2016/07/02 Javascript
angular2倒计时组件使用详解
2017/01/12 Javascript
nodejs中密码加密处理操作详解
2018/03/20 NodeJs
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
node.js通过url读取文件
2020/10/16 Javascript
python函数返回多个值的示例方法
2013/12/04 Python
python爬取个性签名的方法
2018/06/17 Python
python数据分析:关键字提取方式
2020/02/24 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
css3加js做一个简单的3D行星运转效果实例代码
2017/01/18 HTML / CSS
一份Java笔试题
2012/02/21 面试题
生产现场工艺工程师岗位职责
2013/11/28 职场文书
会计专业自荐信
2013/12/02 职场文书
护士实习鉴定范文
2013/12/22 职场文书
应聘医药销售自荐书范文
2014/02/08 职场文书
英语老师推荐信
2014/02/26 职场文书
村容村貌整治方案
2014/05/21 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
索赔员岗位职责
2015/02/15 职场文书
教师工作态度自我评价
2015/03/05 职场文书
Python中使用subprocess库创建附加进程
2021/05/11 Python
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS