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面向对象之继承代码详解
Jan 29 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 Python
分享vim python缩进等一些配置
Jul 02 Python
Python装饰器限制函数运行时间超时则退出执行
Apr 09 Python
Python 获取ftp服务器文件时间的方法
Jul 02 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
linux下python中文乱码解决方案详解
Aug 28 Python
python实现矩阵和array数组之间的转换
Nov 29 Python
Pytorch十九种损失函数的使用详解
Apr 29 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
python代数式括号有效性检验示例代码
Oct 04 Python
python如何为list实现find方法
May 30 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
PHP中实现生成静态文件的方法缓解服务器压力
2014/01/07 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
curl和libcurl的区别简介
2015/07/01 PHP
tp5框架基于Ajax实现列表无刷新排序功能示例
2020/02/10 PHP
JavaScript 对象模型 执行模型
2009/12/06 Javascript
防止页面被iframe(兼容IE,Firefox火狐)
2010/07/04 Javascript
JavaScript打字小游戏代码
2011/12/26 Javascript
9款2014最热门jQuery实用特效推荐
2014/12/07 Javascript
AngularJS基础知识
2014/12/21 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
js性能优化技巧
2015/11/29 Javascript
实用又漂亮的BootstrapValidator表单验证插件
2016/05/30 Javascript
基于vuejs实现一个todolist项目
2017/04/11 Javascript
[js高手之路]设计模式系列课程-发布者,订阅者重构购物车的实例
2017/08/29 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
[01:18]PWL开团时刻DAY10——一拳超人
2020/11/11 DOTA
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
Python sys模块常用方法解析
2020/02/20 Python
详解HTML5中div和section以及article的区别
2015/07/14 HTML / CSS
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
兼职业务员岗位职责
2014/01/01 职场文书
安全生产检查通报
2014/01/29 职场文书
全国文明单位申报材料
2014/05/31 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
铣工实训报告
2014/11/05 职场文书
防震减灾主题班会
2015/08/14 职场文书
情况说明书格式及范文
2019/06/24 职场文书
慰问信的写作格式及范文!
2019/06/24 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers