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生成器generator用法实例分析
Jun 04 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
Python编程实现蚁群算法详解
Nov 13 Python
numpy matrix和array的乘和加实例
Jun 28 Python
Numpy 改变数组维度的几种方法小结
Aug 02 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
Python面向对象程序设计之类的定义与继承简单示例
Mar 18 Python
基于python实现高速视频传输程序
May 05 Python
解决Keras的自定义lambda层去reshape张量时model保存出错问题
Jul 01 Python
Python机器学习之PCA降维算法详解
May 19 Python
Python使用openpyxl批量处理数据
Jun 23 Python
python自动获取微信公众号最新文章的实现代码
Jul 15 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
在PHP3中实现SESSION的功能(一)
2006/10/09 PHP
php存储过程调用实例代码
2013/02/03 PHP
innerHTML,outerHTML,innerTEXT三者之间的区别
2007/01/28 Javascript
刷新时清空文本框内容的js代码
2007/04/23 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
js循环改变div颜色具体方法
2013/06/25 Javascript
JQGrid的用法解析(列编辑,添加行,删除行)
2013/11/08 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
浅谈js for循环输出i为同一值的问题
2017/03/01 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
简单了解JavaScript中的执行上下文和堆栈
2019/06/24 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
[04:27]2014DOTA2国际邀请赛 NAVI战队官方纪录片
2014/07/21 DOTA
[59:48]LGD vs IG 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
python动态加载包的方法小结
2016/04/18 Python
Python 旋转打印各种矩形的方法
2019/07/09 Python
关于Python字符串显示u...的解决方式
2020/03/06 Python
html5关于外链嵌入页面通信问题(postMessage解决跨域通信)
2020/07/20 HTML / CSS
巴西葡萄酒销售网站:Wine.com.br
2017/11/07 全球购物
上班看电影检讨书
2014/02/12 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
信息工作经验交流材料
2014/05/28 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
党员查摆四风问题思想汇报
2014/10/25 职场文书
2014最新自愿离婚协议书范本
2014/11/19 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
素质教育培训心得体会
2016/01/19 职场文书
利用Python+OpenCV三步去除水印
2021/05/28 Python
Java实现给Word文件添加文字水印
2022/02/15 Java/Android
css3新特性的应用示例分析
2022/03/16 HTML / CSS