Python FTP操作类代码分享


Posted in Python onMay 13, 2014
#!/usr/bin/py2
# -*- coding: utf-8 -*-
#encoding=utf-8
'''''
    ftp自动下载、自动上传脚本,可以递归目录操作
'''  
from ftplib import FTP
import os, sys, string, datetime, time
import socket   
class FtpClient:
    def __init__(self, host, user, passwd, remotedir, port=21):
        self.hostaddr = host
        self.username = user
        self.password = passwd
        self.remotedir  = remotedir           
        self.port     = port
        self.ftp      = FTP()
        self.file_list = []   
    def __del__(self):
        self.ftp.close()   
    def login(self):
        ftp = self.ftp
        try:
            timeout = 60
            socket.setdefaulttimeout(timeout)
            ftp.set_pasv(True)
            ftp.connect(self.hostaddr, self.port)
            print 'Connect Success %s' %(self.hostaddr)
            ftp.login(self.username, self.password)
            print 'Login Success %s' %(self.hostaddr)
            debug_print(ftp.getwelcome())
        except Exception:
            deal_error("Connect Error or Login Error")
        try:
            ftp.cwd(self.remotedir)
        except(Exception):
            deal_error('Change Directory Error')   
    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('lo:%d  re:%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):
            return
        else:
            pass
        file_handler = open(localfile, 'wb')
        self.ftp.retrbinary('RETR %s'%(remotefile), file_handler.write)
        file_handler.close()
    def download_files(self, localdir='./', remotedir='./'):
        try:
            self.ftp.cwd(remotedir)
        except:
            return
        if not os.path.isdir(localdir):
            os.makedirs(localdir)
        self.file_list = []
        self.ftp.dir(self.get_file_list)
        remotenames = self.file_list
        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('..')   
    def upload_file(self, localfile, remotefile):
        if not os.path.isfile(localfile):
            return
        if self.is_same_size(localfile, remotefile):
            return
        file_handler = open(localfile, 'rb')
        self.ftp.storbinary('STOR %s' %remotefile, file_handler)
        file_handler.close()   
    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('Directory Exists %s' %item)
                self.upload_files(src, item)
            else:
                self.upload_file(src, item)
        self.ftp.cwd('..')
    def mkdir(self, remotedir='./'):
        try:
            self.ftp.mkd(remotedir)
        except:
            debug_print('Directory Exists %s' %remotedir)
    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(str):
    print (str)
def deal_error(e):
    timenow  = time.localtime()
    datenow  = time.strftime('%Y-%m-%d', timenow)
    logstr = '%s Error: %s' %(datenow, e)
    debug_print(logstr)
    file.write(logstr)
    sys.exit()
Python 相关文章推荐
Python中使用urllib2防止302跳转的代码例子
Jul 07 Python
python从sqlite读取并显示数据的方法
May 08 Python
Python中type的构造函数参数含义说明
Jun 21 Python
python实现在pandas.DataFrame添加一行
Apr 04 Python
解读python logging模块的使用方法
Apr 17 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
python实现简易动态时钟
Nov 19 Python
python使用requests模块实现爬取电影天堂最新电影信息
Apr 03 Python
Django Rest framework解析器和渲染器详解
Jul 25 Python
Python3 tkinter 实现文件读取及保存功能
Sep 12 Python
python的launcher用法知识点总结
Aug 07 Python
在python中对于bool布尔值的取反操作
Dec 11 Python
python生成指定尺寸缩略图的示例
May 07 #Python
python读取浮点数和读取文本文件示例
May 06 #Python
python创建线程示例
May 06 #Python
Python Web服务器Tornado使用小结
May 06 #Python
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 #Python
Python Web开发模板引擎优缺点总结
May 06 #Python
windows系统中python使用rar命令压缩多个文件夹示例
May 06 #Python
You might like
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
php GUID生成函数和类
2014/03/10 PHP
PHP生成唯一订单号
2015/07/05 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
php结合md5的加密解密算法实例
2016/09/30 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
2019/04/12 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
理解Javascript_01_理解内存分配原理分析
2010/10/11 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
省市联动效果的简单实现代码(推荐)
2016/06/06 Javascript
JavaScript实现的XML与JSON互转功能详解
2017/02/16 Javascript
深入理解React Native原生模块与JS模块通信的几种方式
2017/07/24 Javascript
日期时间范围选择插件:daterangepicker使用总结(必看篇)
2017/09/14 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
vuex的使用步骤
2021/01/06 Vue.js
Python判断变量是否已经定义的方法
2014/08/18 Python
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
Python中Threading用法详解
2017/12/27 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
浅谈Html5中视频 音频标签 进度条的问题
2016/07/26 HTML / CSS
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
淘宝客服自我总结鉴定
2014/01/25 职场文书
学校万圣节活动方案
2014/02/13 职场文书
公司门卫的岗位职责
2014/02/19 职场文书
开学典礼策划方案
2014/05/28 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
公司股份合作协议书
2014/12/07 职场文书