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妹子图简单爬虫实例
Jul 07 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
使用Python的package机制如何简化utils包设计详解
Dec 11 Python
30秒轻松实现TensorFlow物体检测
Mar 14 Python
Python读取csv文件分隔符设置方法
Jan 14 Python
Python 类方法和实例方法(@classmethod),静态方法(@staticmethod)原理与用法分析
Sep 20 Python
Django设置Postgresql的操作
May 14 Python
Python如何绘制日历图和热力图
Aug 07 Python
Pycharm自带Git实现版本管理的方法步骤
Sep 18 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
Python 统计序列中元素的出现频度
Apr 26 Python
python使用shell脚本创建kafka连接器
Apr 29 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 mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
浅析linux下apache服务器的配置和管理
2013/08/10 PHP
PHP微信开发之有道翻译
2016/06/23 PHP
ThinkPHP 模板引擎使用详解
2017/05/07 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
Jquery动态进行图片缩略的原理及实现
2013/08/13 Javascript
Bootstrap与KnockoutJs相结合实现分页效果实例详解
2016/05/03 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
JavaScript实现简单动态进度条效果
2018/04/06 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
详解微信小程序图片地扯转base64解决方案
2019/08/18 Javascript
vue中上传视频或图片或图片和文字一起到后端的解决方法
2019/12/01 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
js实现带积分弹球小游戏
2020/07/21 Javascript
浏览器JavaScript调试功能无法使用解决方案
2020/09/18 Javascript
JavaScript对象访问器Getter及Setter原理解析
2020/12/08 Javascript
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
2018/02/05 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
使用python搭建服务器并实现Android端与之通信的方法
2019/06/28 Python
pygame实现打字游戏
2021/02/19 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python文字截图识别OCR工具实例解析
2020/03/05 Python
HTML页面中添加Canvas标签示例
2015/01/01 HTML / CSS
Yahoo-PHP面试题3
2012/01/14 面试题
网上常见的一份Linux面试题(多项选择部分)
2014/09/09 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
大学生创业计划书
2014/08/14 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
南京导游词
2015/02/03 职场文书
研究生个人学年总结
2015/02/14 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书