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使用pyhook监控键盘并实现切换歌曲的功能
Jul 18 Python
使用C语言扩展Python程序的简单入门指引
Apr 14 Python
浅析Python中else语句块的使用技巧
Jun 16 Python
Python数据结构之单链表详解
Sep 12 Python
python去除文件中重复的行实例
Jun 29 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
python二进制读写及特殊码同步实现详解
Oct 11 Python
pycharm快捷键汇总
Feb 14 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
Python利用Xpath选择器爬取京东网商品信息
Jun 01 Python
tensorflow基于CNN实战mnist手写识别(小白必看)
Jul 20 Python
Python爬取数据并实现可视化代码解析
Aug 12 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
ajax 的post方法实例(带循环)
2011/07/04 PHP
php常用数学函数汇总
2014/11/21 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
jquery 图片轮换效果
2010/07/29 Javascript
基于jquery实现点击左右按钮图片横向滚动
2013/04/11 Javascript
Dom 学习总结以及实例的使用介绍
2013/04/24 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
浅谈window.onbeforeunload() 事件调用ajax
2016/06/29 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
2016/12/13 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
JS中创建自定义类型的常用模式总结【工厂模式,构造函数模式,原型模式,动态原型模式等】
2019/01/19 Javascript
详解JavaScript原生封装ajax请求和Jquery中的ajax请求
2019/02/14 jQuery
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
Python学习笔记之常用函数及说明
2014/05/23 Python
编写Python脚本把sqlAlchemy对象转换成dict的教程
2015/05/29 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
2016/12/18 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
2019/08/06 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
python输出第n个默尼森数的实现示例
2020/03/08 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
Python OpenCV实现测量图片物体宽度
2020/05/27 Python
详解如何修改python中字典的键和值
2020/09/29 Python
Groupon法国官方网站:特卖和网上购物高达-70%
2019/09/02 全球购物
《一本男孩子必读的书》教学反思
2014/02/19 职场文书
幼儿园的门卫岗位职责
2014/04/10 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
实习单位鉴定意见
2015/06/04 职场文书
教师师德工作总结2015
2015/07/22 职场文书
2016年教师寒假学习心得体会
2015/10/09 职场文书