Python FTP

# -*- coding: utf-8 -*
import ftplib
import os
import sys
import time
import socket


def get_filename(line):
    pos = line.rfind(':')
    while line[pos] != ' ':
        pos += 1
    while line[pos] == ' ':
        pos += 1
    file_arr = [line[0], line[pos:]]
    return file_arr


class UserFtp:
    def __init__(self, _hostaddr, _username, _password, _remotedir, _port=21):
        self.hostaddr = _hostaddr
        self.username = _username
        self.password = _password
        self.remotedir = _remotedir
        self.port = _port
        self.ftp = ftplib.FTP()
        self.file_list = []
        # self.ftp.set_debuglevel(2)

    def __del__(self):
        self.ftp.close()
        # self.ftp.set_debuglevel(0)

    def login(self):
        ftp = self.ftp
        try:
            timeout = 60
            socket.setdefaulttimeout(timeout)
            ftp.set_pasv(True)
            print '开始连接到 %s' % self.hostaddr
            ftp.connect(self.hostaddr, self.port)
            print '成功连接到 %s' % self.hostaddr
            print '开始登录到 %s' % self.hostaddr
            ftp.login(self.username, self.password)
            print '成功登录到 %s' % self.hostaddr
            print ftp.getwelcome()
        except Exception, e:
            print e.message
            return False
        try:
            ftp.cwd(self.remotedir)
        except Exception, e:
            print e.message
            return False
        return True

    def is_same_size(self, localfile, remotefile):
        try:
            remotefile_size = self.ftp.size(remotefile)
        except Exception, e:
            remotefile_size = -1
            print e.message
        try:
            localfile_size = os.path.getsize(localfile)
        except Exception, e:
            localfile_size = -1
            print e.message
        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):
            print '%s 文件大小相同,无需下载' % localfile
            return
        else:
            print '>>>>>>>>>>>>下载文件 %s ... ...' % localfile
            # return
        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 Exception, e:
            print e.message
            print '目录%s不存在,继续...' % remotedir
            return
        if not os.path.isdir(localdir):
            os.makedirs(localdir)
            print '切换至目录 %s' % self.ftp.pwd()
        self.file_list = []
        self.ftp.dir(self.get_file_list)
        remotenames = self.file_list
        # print(remotenames)
        # return
        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('..')
        print '返回上层目录 %s' % self.ftp.pwd()

    def upload_file(self, localfile, remotefile):
        if not os.path.isfile(localfile):
            return
        if self.is_same_size(localfile, remotefile):
            localfile = localfile.decode('gbk').encode('utf-8')
            print '跳过[相等]: %s' % localfile
            return
        file_handler = open(localfile, 'rb')
        self.ftp.storbinary('STOR %s' % remotefile, file_handler)
        file_handler.close()
        localfile = localfile.decode('gbk').encode('utf-8')
        print '已传送: %s' % localfile

    def upload_files(self, localdir='./', remotedir='./'):
        if not os.path.isdir(localdir):
            return
        localnames = os.listdir(localdir)
        try:
            self.ftp.cwd(remotedir)
        except Exception, e:
            print e.message
            return
        for item in localnames:
            src = os.path.join(localdir, item)
            if os.path.isdir(src):
                try:
                    self.ftp.mkd(item)
                except Exception, e:
                    print e.message
                    print '目录已存在 %s' % item
                self.upload_files(src, item)
            else:
                self.upload_file(src, item)
        self.ftp.cwd('..')

    def get_file_list(self, line):
        file_arr = get_filename(line)
        if file_arr[1] not in ['.', '..']:
            self.file_list.append(file_arr)


def deal_error(e):
    timenow = time.localtime()
    datenow = time.strftime('%Y-%m-%d', timenow)
    logstr = '%s 发生错误: %s' % (datenow, e)
    print logstr
    # file.write(logstr)
    # sys.exit()


if __name__ == '__main__':
    # file = open("log.txt", "a")
    # timenow = time.localtime()
    # datenow = time.strftime('%Y-%m-%d', timenow)
    # logstr = datenow

    print sys.getdefaultencoding()

    # 配置如下变量
    hostaddr = '192.168.0.1'  # ftp地址
    username = 'admin'  # 用户名
    password = '123456'  # 密码
    port = 21  # 端口号
    rootdir_local = '.' + os.sep + 'bak/'  # 本地目录
    rootdir_remote = './'  # 远程目录

    userFtp = UserFtp(hostaddr, username, password, rootdir_remote, port)
    ret = userFtp.login()
    if ret:
        userFtp.upload_files("F:\documents", './1')

    # f.download_files(rootdir_local, rootdir_remote)

    # timenow = time.localtime()
    # datenow = time.strftime('%Y-%m-%d', timenow)
    # logstr += " - %s 成功执行了备份\n" % datenow
    # debug_print(logstr)
    #
    # file.write(logstr)
    # file.close()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值