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 相关文章推荐
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
python实现数据分析与建模
Jul 11 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
python绘制随机网络图形示例
Nov 21 Python
Python使用GitPython操作Git版本库的方法
Feb 29 Python
详解python logging日志传输
Jul 01 Python
python爬取音频下载的示例代码
Oct 19 Python
python regex库实例用法总结
Jan 03 Python
Jupyter Notebook 安装配置与使用详解
Jan 06 Python
plt.figure()参数使用详解及运行演示
Jan 08 Python
python 基于opencv去除图片阴影
Jan 26 Python
python 利用matplotlib在3D空间中绘制平面的案例
Feb 06 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简单的伪原创程序,配合商城采集用的
2010/10/12 PHP
通过PHP current函数获取未知字符键名数组第一个元素的值
2013/06/24 PHP
php的GD库imagettftext函数解决中文乱码问题
2015/01/24 PHP
用jscript实现新建word文档
2007/06/15 Javascript
js 获取浏览器高度和宽度值(多浏览器)
2009/09/02 Javascript
juqery 学习之四 筛选查找
2010/11/30 Javascript
js限制文本框只能输入数字(正则表达式)
2012/07/15 Javascript
javascript 中String.match()与RegExp.exec()的区别说明
2013/01/10 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
node.js中的fs.realpath方法使用说明
2014/12/16 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
jQuery+canvas实现简单的球体斜抛及颜色动态变换效果
2016/01/28 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
JavaScript 保护变量不被随意修改的实现代码
2017/09/27 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
vue form 表单提交后刷新页面的方法
2018/09/04 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
Servlet返回的数据js解析2种方法
2019/12/12 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
python爬取网站数据保存使用的方法
2013/11/20 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
Python使用redis pool的一种单例实现方式
2016/04/16 Python
python实现最小二乘法线性拟合
2019/07/19 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
师范学院毕业生求职信范文
2013/12/26 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
日语专业求职信
2014/07/04 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
领导欢迎词致辞
2015/01/23 职场文书
关于环保的宣传稿
2015/07/23 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL
Redis中一个String类型引发的惨案
2021/07/25 Redis
电脑关机速度很慢怎么办 提升电脑关机速度设置教程
2022/04/08 数码科技