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 相关文章推荐
浅谈flask截获所有访问及before/after_request修饰器
Jan 18 Python
python matlibplot绘制多条曲线图
Feb 19 Python
Python enumerate函数功能与用法示例
Mar 01 Python
Python实现数据结构线性链表(单链表)算法示例
May 04 Python
python使用 __init__初始化操作简单示例
Sep 26 Python
python 实现Flask中返回图片流给前端展示
Jan 09 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
浅谈numpy中np.array()与np.asarray的区别以及.tolist
Jun 03 Python
Python实现打包成库供别的模块调用
Jul 13 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
python在协程中增加任务实例操作
Feb 28 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
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
PHP 编写的 25个游戏脚本
2009/05/11 PHP
php微信公众开发之获取周边酒店信息的方法
2014/12/22 PHP
PHP实现上传文件并存进数据库的方法
2015/07/16 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
2017/01/22 PHP
windows环境下使用Composer安装ThinkPHP5
2018/05/18 PHP
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
javascript编码的几个方法详细介绍
2013/01/06 Javascript
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
jQuery写fadeTo示例代码
2014/02/21 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
jquery mobile界面数据刷新的实现方法
2016/05/28 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
详解Vue2+Echarts实现多种图表数据可视化Dashboard(附源码)
2017/03/21 Javascript
axios学习教程全攻略
2017/03/26 Javascript
Vue制作Todo List网页
2017/04/26 Javascript
Node.js 使用递归实现遍历文件夹中所有文件
2017/09/18 Javascript
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
vue实现抖音时间转盘
2019/09/08 Javascript
Vue循环中多个input绑定指定v-model实例
2020/08/31 Javascript
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
python对数组进行反转的方法
2015/05/20 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
在Python中实现函数重载的示例代码
2019/12/12 Python
简述 Python 的类和对象
2020/08/21 Python
阿根廷在线宠物商店:Puppis
2018/03/23 全球购物
选购国际女性时装设计师品牌:IFCHIC(支持中文)
2018/04/12 全球购物
Hudson Jeans官网:高级精制牛仔裤
2018/11/28 全球购物
幼儿园中班下学期评语
2014/04/18 职场文书
会计岗位职责
2015/02/03 职场文书
2015年体育教师个人工作总结
2015/05/12 职场文书
钢琴师观后感
2015/06/12 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
2019同学聚会主持词
2019/05/06 职场文书
在Docker容器中部署SQL Server
2022/04/11 Servers