python实现从ftp服务器下载文件


Posted in Python onMarch 03, 2020

代码之余,将代码过程重要的一些代码段备份一下,如下的代码内容是关于Python从ftp服务器下载文件的的代码,希望能对小伙伴有用途。

#coding=utf-8
'''
 ftp自动下载、自动上传脚本,可以递归目录操作
'''

from ftplib import FTP
import os,sys,string,datetime,time
import socket

class MYFTP:
 def __init__(self, hostaddr, username, password, remotedir, port=21):
 self.hostaddr = hostaddr
 self.username = username
 self.password = password
 self.remotedir = remotedir
 self.port  = port
 self.ftp  = FTP()
 self.file_list = []
 # self.ftp.set_debuglevel(2)
 def __del__(self):
 self.ftp.close()
 # self.ftp.set_debuglevel(0)
 def login(self):
 ftp = self.ftp
 try: 
 timeout = 300
 socket.setdefaulttimeout(timeout)
 ftp.set_pasv(True)
 print u'开始连接到 %s' %(self.hostaddr)
 ftp.connect(self.hostaddr, self.port)
 print u'成功连接到 %s' %(self.hostaddr)
 print u'开始登录到 %s' %(self.hostaddr)
 ftp.login(self.username, self.password)
 print u'成功登录到 %s' %(self.hostaddr)
 debug_print(ftp.getwelcome())
 except Exception:
 print u'连接或登录失败'
 try:
 ftp.cwd(self.remotedir)
 except(Exception):
 print u'切换目录失败'

 def is_same_size(self, localfile, remotefile):
 try:
 remotefile_size = self.ftp.size(remotefile)
 except:
 remotefile_size = -1
 try:
 localfile_size = os.path.getsize(localfile)
 except:
 localfile_size = -1
 debug_print('localfile_size:%d remotefile_size:%d' %(localfile_size, remotefile_size),)
 if remotefile_size == localfile_size:
 return 1
 else:
 return 0
 def download_file(self, localfile, remotefile):
 if self.is_same_size(localfile, remotefile):
 debug_print(u'%s 文件大小相同,无需下载' %localfile)
 return
 else:
 debug_print(u'>>>>>>>>>>>>下载文件 %s ... ...' %localfile)
 #return
 file_handler = open(localfile, 'wb')
 self.ftp.retrbinary(u'RETR %s'%(remotefile), file_handler.write)
 file_handler.close()

 def download_files(self, localdir='./', remotedir='./'):
 try:
 self.ftp.cwd(remotedir)
 except:
 debug_print(u'目录%s不存在,继续...' %remotedir)
 return
 if not os.path.isdir(localdir):
 os.makedirs(localdir)
 debug_print(u'切换至目录 %s' %self.ftp.pwd())
 self.file_list = []
 self.ftp.dir(self.get_file_list)
 remotenames = self.file_list
 #print(remotenames)
 #return
 for item in remotenames:
 filetype = item[0]
 filename = item[1]
 local = os.path.join(localdir, filename)
 if filetype == 'd':
 self.download_files(local, filename)
 elif filetype == '-':
 self.download_file(local, filename)
 self.ftp.cwd('..')
 debug_print(u'返回上层目录 %s' %self.ftp.pwd())
 def upload_file(self, localfile, remotefile):
 if not os.path.isfile(localfile):
 return
 if self.is_same_size(localfile, remotefile):
 debug_print(u'跳过[相等]: %s' %localfile)
 return
 file_handler = open(localfile, 'rb')
 self.ftp.storbinary('STOR %s' %remotefile, file_handler)
 file_handler.close()
 debug_print(u'已传送: %s' %localfile)
 def upload_files(self, localdir='./', remotedir = './'):
 if not os.path.isdir(localdir):
 return
 localnames = os.listdir(localdir)
 self.ftp.cwd(remotedir)
 for item in localnames:
 src = os.path.join(localdir, item)
 if os.path.isdir(src):
 try:
  self.ftp.mkd(item)
 except:
  debug_print(u'目录已存在 %s' %item)
 self.upload_files(src, item)
 else:
 self.upload_file(src, item)
 self.ftp.cwd('..')

 def get_file_list(self, line):
 ret_arr = []
 file_arr = self.get_filename(line)
 if file_arr[1] not in ['.', '..']:
 self.file_list.append(file_arr)
 
 def get_filename(self, line):
 pos = line.rfind(':')
 while(line[pos] != ' '):
 pos += 1
 while(line[pos] == ' '):
 pos += 1
 file_arr = [line[0], line[pos:]]
 return file_arr
def debug_print(s):
 print s

if __name__ == '__main__':
 timenow = time.localtime()
 datenow = time.strftime('%Y-%m-%d', timenow)
 # 配置如下变量
 hostaddr = '211.15.113.45' # ftp地址
 username = 'UserName' # 用户名
 password = '123456' # 密码
 port = 21 # 端口号 
 rootdir_local = 'E:/mypiv' # 本地目录
 rootdir_remote = '/PIV'   # 远程目录
 
 f = MYFTP(hostaddr, username, password, rootdir_remote, port)
 f.login()
 f.download_files(rootdir_local, rootdir_remote)
 
 timenow = time.localtime()
 datenow = time.strftime('%Y-%m-%d', timenow)
 logstr = u"%s 成功执行了备份n" %datenow
 debug_print(logstr)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python读写excel的方法
Nov 18 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
OpenCV2从摄像头获取帧并写入视频文件的方法
Aug 03 Python
Python  unittest单元测试框架的使用
Sep 08 Python
python读取几个G的csv文件方法
Jan 07 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
python用类实现文章敏感词的过滤方法示例
Oct 27 Python
pyenv虚拟环境管理python多版本和软件库的方法
Dec 26 Python
python中如何使用虚拟环境
Oct 14 Python
Python操作Excel的学习笔记
Feb 18 Python
Python基础知识学习之类的继承
May 31 Python
Python实现DBSCAN聚类算法并样例测试
Jun 22 Python
python实现简单的购物程序代码实例
Mar 03 #Python
python实现跨excel sheet复制代码实例
Mar 03 #Python
python剪切视频与合并视频的实现
Mar 03 #Python
详解Pycharm出现out of memory的终极解决方法
Mar 03 #Python
基于python 等频分箱qcut问题的解决
Mar 03 #Python
python实现快递价格查询系统
Mar 03 #Python
使用python 计算百分位数实现数据分箱代码
Mar 03 #Python
You might like
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
JS实现图片横向滚动效果示例代码
2013/09/04 Javascript
js仿土豆网带缩略图的焦点图片切换效果实现方法
2015/02/23 Javascript
jQuery实现hover合成事件的方法
2015/08/06 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
jQuery中on绑定事件后引发的事件冒泡问题如何解决
2016/05/25 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
web 屏蔽BackSpace键实例代码
2016/12/24 Javascript
Canvas实现放射线动画效果
2017/02/15 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
webpack4.x下babel的安装、配置及使用详解
2019/03/07 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
python BeautifulSoup使用方法详解
2013/11/21 Python
Python pass 语句使用示例
2014/03/11 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
python3中函数参数的四种简单用法
2018/07/09 Python
python的pygal模块绘制反正切函数图像方法
2019/07/16 Python
Python+numpy实现矩阵的行列扩展方式
2019/11/29 Python
python基于event实现线程间通信控制
2020/01/13 Python
关于python中的xpath解析定位
2020/03/06 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
python读取图像矩阵文件并转换为向量实例
2020/06/18 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
详解CSS 3 中的 calc() 方法
2018/01/12 HTML / CSS
CSS3 实现footer 固定在底部(无论页面多高始终在底部)
2019/10/15 HTML / CSS
北京振戎融通Java面试题
2015/09/03 面试题
党员公开承诺书
2014/03/25 职场文书
抗洪救灾先进集体事迹材料
2014/05/26 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
读书笔记怎么写
2015/07/01 职场文书
2016元旦文艺汇演主持词(开场白+结束语)
2015/12/03 职场文书
详解Python生成器和基于生成器的协程
2021/06/03 Python
PyQt5结合QtDesigner实现文本框读写操作
2021/06/11 Python