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实现繁体中文与简体中文相互转换的方法示例
Dec 18 Python
python将txt文档每行内容循环插入数据库的方法
Dec 28 Python
Python3中exp()函数用法分析
Feb 19 Python
python实现转圈打印矩阵
Mar 02 Python
python Pandas库基础分析之时间序列的处理详解
Jul 13 Python
python+selenium select下拉选择框定位处理方法
Aug 24 Python
python读取Kafka实例
Dec 23 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
python计算auc的方法
Sep 09 Python
十个Python自动化常用操作,即拿即用
May 10 Python
pytorch 如何使用batch训练lstm网络
May 28 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
5.PHP的其他功能
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PHP生成唯一订单号
2015/07/05 PHP
PHP面向对象程序设计高级特性详解(接口,继承,抽象类,析构,克隆等)
2016/12/02 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
我也种棵OO树JXTree[js+css+xml]
2007/04/02 Javascript
javascript EXCEL 操作类代码
2009/07/30 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
node.js中的fs.lchown方法使用说明
2014/12/16 Javascript
jQuery实现的类似淘宝网站搜索框样式代码分享
2015/08/24 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
jQuery实现三级菜单的代码
2016/05/09 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
AngularJS实践之使用ng-repeat中$index的注意点
2016/12/22 Javascript
Javascript面试经典套路reduce函数查重
2017/03/23 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
JavaScript事件发布/订阅模式原理与用法分析
2018/08/21 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
微信小程序如何实现radio单选框单击打勾和取消
2020/01/21 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
轻松实现TensorFlow微信跳一跳的AI
2018/01/05 Python
python实现mysql的读写分离及负载均衡
2018/02/04 Python
全面分析Python的优点和缺点
2018/02/07 Python
python 实现在一张图中绘制一个小的子图方法
2019/07/07 Python
利用Pytorch实现简单的线性回归算法
2020/01/15 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
英国最大的女士服装零售商:Bonmarché
2017/08/17 全球购物
茶叶生产计划书
2014/01/10 职场文书
出生证明公证书
2014/04/09 职场文书
Redis实战高并发之扣减库存项目
2022/04/14 Redis