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中字符串对齐方法介绍
May 21 Python
Python合并两个字典的常用方法与效率比较
Jun 17 Python
Django框架中处理URLconf中特定的URL的方法
Jul 20 Python
Python标准库之collections包的使用教程
Apr 27 Python
如何在django中实现分页功能
Apr 22 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 Python
Python scrapy爬取小说代码案例详解
Jul 09 Python
浅析python中的del用法
Sep 02 Python
Python模拟登录和登录跳转的参考示例
Oct 30 Python
python中scipy.stats产生随机数实例讲解
Feb 19 Python
Python中的datetime包与time包包和模块详情
Feb 28 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
PHP 的几个配置文件函数
2006/12/21 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
PHP和.net中des加解密的实现方法
2013/02/27 PHP
PHP实现递归复制整个文件夹的类实例
2015/08/03 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
php实现学生管理系统
2020/03/21 PHP
简单的pgsql pdo php操作类实现代码
2016/08/25 PHP
浅谈htmlentities 、htmlspecialchars、addslashes的使用方法
2016/12/09 PHP
javascript 三种编解码方式
2010/02/01 Javascript
css值转换成数值请抛弃parseInt
2011/10/24 Javascript
理解JavaScript的prototype属性
2012/02/11 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
js星星评分效果
2014/07/24 Javascript
javascript实现任务栏消息提示的简单实例
2016/05/31 Javascript
AngularJS中比较两个数组是否相同
2016/08/24 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
浅谈ES6 模板字符串的具体使用方法
2017/11/07 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
JQuery实现ajax请求的示例和注意事项
2018/12/10 jQuery
node 解析图片二维码的内容代码实例
2019/09/11 Javascript
微信小程序实现一个简单swiper代码实例
2019/12/30 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
Python获取任意xml节点值的方法
2015/05/05 Python
python查看zip包中文件及大小的方法
2015/07/09 Python
关于Python 3中print函数的换行详解
2017/08/08 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
Python字符串处理的8招秘籍(小结)
2019/08/13 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
利用python实现逐步回归
2020/02/24 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Trunki英国官网:儿童坐骑式行李箱
2017/05/30 全球购物
法院信息化建设方案
2014/05/21 职场文书
企业文化标语大全
2014/06/10 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB