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实现的简单猜数字游戏
Apr 04 Python
Python编程之多态用法实例详解
May 19 Python
简单实现python聊天程序
Apr 01 Python
Python实现针对给定单链表删除指定节点的方法
Apr 12 Python
python print 按逗号或空格分隔的方法
May 02 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
基于Django统计博客文章阅读量
Oct 29 Python
python类中super() 的使用解析
Dec 19 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
Selenium常见异常解析及解决方案示范
Apr 10 Python
Python爬取网站图片并保存的实现示例
Feb 26 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
在PWS上安装PHP4.0正式版
2006/10/09 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
PHP对文件夹递归执行chmod命令的方法
2015/06/19 PHP
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
图片动画横条广告带上下滚动的JS代码
2013/10/25 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
将html页面保存成图片,图片写入pdf的实现方法(推荐)
2016/09/17 Javascript
过期软件破解办法实例详解
2017/01/04 Javascript
10道典型的JavaScript面试题
2017/03/22 Javascript
Node 自动化部署的方法
2017/10/17 Javascript
vue 登录滑动验证实现代码
2018/08/24 Javascript
js实现图片上传即时显示效果
2019/09/30 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
Python Web服务器Tornado使用小结
2014/05/06 Python
Python读写Excel文件方法介绍
2014/11/22 Python
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
使用python实现knn算法
2017/12/20 Python
Python编写Windows Service服务程序
2018/01/04 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
Django+boostrap 美化admin后台的操作
2020/03/11 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
基于Python绘制个人足迹地图
2020/06/01 Python
Pycharm打开已有项目配置python环境的方法
2020/07/03 Python
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
捐款倡议书范文
2014/02/02 职场文书
小松树教学反思
2014/02/11 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
商场促销活动策划方案
2014/08/18 职场文书
追悼会答谢词
2015/01/05 职场文书
库房管理员岗位职责
2015/02/12 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
十二月早安励志心语大全
2019/12/03 职场文书