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的Cookie.py模块支持冒号做key的方法
Dec 28 Python
Python中还原JavaScript的escape函数编码后字符串的方法
Aug 22 Python
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
May 22 Python
Python打印斐波拉契数列实例
Jul 07 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
python使用turtle库绘制树
Jun 25 Python
Python操作qml对象过程详解
Sep 26 Python
PyCharm 2020 激活到 2100 年的教程
Mar 25 Python
python如何获取网络数据
Apr 11 Python
Python合并pdf文件的工具
Jul 01 Python
Python IO文件管理的具体使用
Mar 20 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
Linux下安装PHP MSSQL扩展教程
2014/10/24 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
在Javascript中 声明时用"var"与不用"var"的区别
2013/04/15 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
js 获取、清空input type="file"的值示例代码
2014/02/19 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jQuery图片轮播插件——前端开发必看
2016/05/31 Javascript
JavaScript基于原型链的继承
2016/06/22 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
js模拟微博发布消息
2017/02/23 Javascript
详解webpack异步加载业务模块
2017/06/23 Javascript
手动下载Chrome并解决puppeteer无法使用问题
2018/11/12 Javascript
react组件从搭建脚手架到在npm发布的步骤实现
2019/01/09 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
JS数据类型(基本数据类型、引用数据类型)及堆和栈的区别分析
2020/03/04 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
python查找目录下指定扩展名的文件实例
2015/04/01 Python
Python实现PS滤镜Fish lens图像扭曲效果示例
2018/01/29 Python
python实现推箱子游戏
2020/03/25 Python
在pycharm中使用git版本管理以及同步github的方法
2019/01/16 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
Django REST框架创建一个简单的Api实例讲解
2019/11/05 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
违反校纪校规检讨书
2014/02/15 职场文书
婚假请假条怎么写
2014/04/10 职场文书
十佳少先队员演讲稿
2014/09/12 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
个人查摆剖析材料
2014/10/04 职场文书
先进工作者事迹材料
2014/12/23 职场文书
CSS 实现多彩、智能的阴影效果
2021/05/12 HTML / CSS
SQL Server中的逻辑函数介绍
2022/05/25 SQL Server
Python时间操作之pytz模块使用详解
2022/06/14 Python