python实现FTP循环上传文件

测试过程中,有时会用到FTP的数据流,或者需要使用FTP反复上传文件,所以写了一个FTP循环上传文件的python代码。

代码如下:

#coding=utf-8

import sys
import os
from ftplib import FTP
from time import sleep

_XFER_FILE = 'FILE'
_XFER_DIR = 'DIR'


class Transmitter(object):  # 注意:递归上传本地文件或dirs到ftp服务器

    def __init__(self):
        self.ftp = None

    def __del__(self):
        pass

    def setFtpParams(self, ip, uname, pwd, port=21, timeout=60):
        self.ip = ip
        self.uname = uname
        self.pwd = pwd
        self.port = port
        self.timeout = timeout

    def initEnv(self):
        if self.ftp is None:
            self.ftp = FTP()
            print('### 连接FTP服务器: %s ...' % self.ip)
            self.ftp.connect(self.ip, self.port, self.timeout)
            self.ftp.login(self.uname, self.pwd)

    def clearEnv(self):
        if self.ftp:
            self.ftp.close()
            print('### 断开FTP服务器: %s!' % self.ip)
            self.ftp = None

    def uploadDir(self, localdir='./', remotedir='./'):
        if not os.path.isdir(localdir):
            return
        self.ftp.cwd(remotedir)
        for file in os.listdir(localdir):
            src = os.path.join(localdir, file)
            if os.path.isfile(src):
                self.uploadFile(src, file)
            elif os.path.isdir(src):
                try:
                    self.ftp.mkd(file)
                except:
                    sys.stderr.write('目录存在 %s' % file)
                self.uploadDir(src, file)
        self.ftp.cwd('..')

    def uploadFile(self, localpath, remotepath='./'):
        if not os.path.isfile(localpath):
            return
        print('+++ 上传 %s to %s:%s' % (localpath, self.ip, remotepath))
        self.ftp.storbinary('STOR ' + remotepath, open(localpath, 'rb'))
        sleep(0.5)
        try:
            self.ftp.delete(remotepath)
        except:
            pass
        # del file when uploaded this file
        # os.remove(localpath)
        # sleep(1)

    def __filetype(self, src):
        if os.path.isfile(src):
            index = src.rfind('\')
            if index == -1:
                index = src.rfind('/')
            return _XFER_FILE, src[index + 1:]
        elif os.path.isdir(src):
            return _XFER_DIR, ''

    def upload(self, src):
        filetype, filename = self.__filetype(src)
        self.initEnv()
        if filetype == _XFER_DIR:
            self.srcDir = src
            self.uploadDir(self.srcDir)
        elif filetype == _XFER_FILE:
            self.uploadFile(src, filename)
        self.clearEnv()


if __name__ == '__main__':
    srcDir = r'C:UsersAdministratorDownloadsFTPsmp'
    transmitter = Transmitter()
    transmitter.setFtpParams('10.44.0.2', 'admin', '123123')

    while True:
        transmitter.upload(srcDir)
        sleep(4)
原文地址:https://www.cnblogs.com/APeng2019/p/10719306.html