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 08 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
Nov 09 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
Sep 18 Python
python 实现一次性在文件中写入多行的方法
Jan 28 Python
python操作小程序云数据库实现简单的增删改查功能
Jun 06 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
对python中的装包与解包实例详解
Aug 24 Python
python实现的汉诺塔算法示例
Oct 23 Python
python实现超级马里奥
Mar 18 Python
python实现与redis交互操作详解
Apr 21 Python
Python Django项目和应用的创建详解
Nov 27 Python
Python图像处理库PIL详细使用说明
Apr 06 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实现链式操作的三种方法详解
2017/11/16 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
jquery用get实现ajax在ie里面刷新不进入后台解决方法
2013/08/12 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
jquery动态改变div宽度和高度
2015/02/09 Javascript
Javascript实现获取及设置光标位置的方法
2015/07/21 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
jquery左右全屏大尺寸多图滑动效果代码分享
2015/08/28 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
ES6记录异步函数的执行时间详解
2016/08/31 Javascript
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
layer.open 按钮的点击事件关闭方法
2018/08/17 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
JS前端知识点总结之页面加载事件,数组操作,DOM节点操作,循环和分支
2019/07/04 Javascript
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
Python文件夹与文件的操作实现代码
2014/07/13 Python
Python tkinter事件高级用法实例
2018/01/31 Python
浅析Python 序列化与反序列化
2020/08/05 Python
python3实现名片管理系统(控制台版)
2020/11/29 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
linux下进程间通信的方式
2014/12/23 面试题
中学教师实习自我鉴定
2013/09/28 职场文书
应届毕业生个人自荐信范文
2013/11/30 职场文书
12月小学生校园广播稿
2014/02/04 职场文书
经营理念标语
2014/06/21 职场文书
2015新学期家长寄语
2015/02/26 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
法人代表证明书范本
2015/06/18 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android
Python中re模块的元字符使用小结
2022/04/07 Python