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的几条建议分享
Feb 10 Python
Python3遍历目录树实现方法
May 22 Python
python中的内置函数max()和min()及mas()函数的高级用法
Mar 29 Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
Nov 19 Python
Python调用.NET库的方法步骤
Dec 27 Python
Python统计时间内的并发数代码实例
Dec 28 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
Mar 10 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
Django框架实现在线考试系统的示例代码
Nov 30 Python
Selenium关闭INFO:CONSOLE提示的解决
Dec 07 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出错界面
2006/10/09 PHP
php的常量和变量实例详解
2017/06/27 PHP
PHP实现腾讯与百度坐标转换
2017/08/05 PHP
IE6,IE7下js动态加载图片不显示错误
2010/07/17 Javascript
javascript中new关键字详解
2015/12/14 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
几种响应式文字详解
2017/05/19 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
mint-ui在vue中的使用示例
2018/04/05 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
JavaScript数组及常见操作方法小结
2019/11/13 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
JS实现拖拽元素时与另一元素碰撞检测
2020/08/27 Javascript
python导入坐标点的具体操作
2019/05/10 Python
opencv python 对指针仪表读数识别的两种方式
2021/01/14 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
美丽的现代设计家具:2Modern
2018/07/26 全球购物
Made in Design英国:设计家具、照明、家庭装饰和花园家具
2019/09/24 全球购物
初中三年学生的学习自我评价
2013/11/13 职场文书
应届大专毕业生自我鉴定
2014/04/08 职场文书
授权委托书范文
2014/07/31 职场文书
股东授权委托书范本
2014/09/13 职场文书
教师自我剖析材料
2014/09/29 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2014年学校党建工作总结
2014/11/11 职场文书
公司感谢信范文
2015/01/22 职场文书
学校捐款活动总结
2015/05/09 职场文书
阿甘正传观后感
2015/06/01 职场文书
初三毕业感言
2015/07/31 职场文书
护士业务学习心得体会
2016/01/25 职场文书
Python使用scapy模块发包收包
2021/05/07 Python
python+opencv实现目标跟踪过程
2022/06/21 Python