Python:ftplib向FTP服务器上传或下载文件

版权声明:转载请标明出处 https://blog.csdn.net/w1418899532/article/details/84590872

ftplib模块是Python中默认安装的,通过它定义的FTP类中的各个函数,可以完成对FTP服务器的操作,既能实现简单的ftp客户端,也可以连接或者操作FTP服务端,完成文件上传或下载。

1.函数介绍

ftplib模块中各个函数功能如下:
FTP常用函数

ftp=FTP()          		      #设置变量 ,实例化
ftp.set_debuglevel(2)         #打开调试级别2,显示详细信息 
ftp.connect("IP","port")      #连接的ftp sever和端口 
ftp.login("user","password")  #连接的用户名,密码 
print ftp.getwelcome()        #打印出欢迎信息 
ftp.cmd("xxx/xxx")     		  #更改远程目录 
bufsize=1024                  #设置的缓冲区大小 
filename="filename.txt"       #需要下载的文件 
file_handle=open(filename,"wb").write
#以写模式在本地打开文件 
ftp.retrbinaly("RETR filename.txt",file_handle,bufsize)
#接收服务器上文件并写入本地文件 
ftp.set_debuglevel(0)        #关闭调试模式 
ftp.quit                     #退出ftp 
ftp.dir()                    #显示目录下文件信息 
ftp.pwd()          	         #返回当前所在位置 
ftp.cwd(pathname) 	         #设置FTP当前操作的路径
ftp.mkd(pathname)            #新建远程目录
ftp.rmd(dirname)             #删除远程目录 
ftp.delete(filename)         #删除远程文件 
ftp.rename(oldname, newname) #将oldname修改名称为newname。 
ftp.storbinaly("STOR filename.txt",file_handel,bufsize) #上传目标文件
ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP目标文件

2.实现向多个FTP服务器传输文件

实例:
向多个FTP服务器传输文件。

#!/usr/bin/python 
#-*- coding:utf-8 -*- 
#功能:远程传输Zip文件
import ftplib   #加载ftp模块 

#配置FTP服务器
g_FtpServers=[10.1.1.1,10.1.1.2,10.1.1.3]

def DoFtpTrans(ZipOutputDir):
    global g_FtpServers    
    FileNumCount = 0
    FileSizeCount = 0
    ErrorRemark = ''
    
    if 0 >= len(ZipOutputDir):
        ErrorRemark += '\t没有配置ZIP目录\n'
        return FileNumCount,FileSizeCount,ErrorRemark
    if 0 >= len(g_FtpServers):
        ErrorRemark += '\t没有配置任何服务器\n'
        return FileNumCount,FileSizeCount,ErrorRemark
    #目录下zip文件总数
    TotalZipFileNum = len(os.listdir(ZipOutputDir))
    CurrZipFilePos = 0
    ZipFileNum = TotalZipFileNum/len(g_FtpServers)

    if 0>=ZipFileNum:
        return FileNumCount,FileSizeCount,ErrorRemark
    if 0<g_MaxFileCountPerFtp and g_MaxFileCountPerFtp<ZipFileNum:
        ZipFileNum = g_MaxFileCountPerFtp
    #开始传输
    ZipFileList = os.listdir(ZipOutputDir)
    ZipFileListCount = len(ZipFileList)
    for FtpServer in g_FtpServers:    
        FtpConnect = ftplib.FTP()        
        try:
            FtpConnect.connect(FtpServer[0], FtpServer[1], 30)
        except:
            ErrorRemark += '\t连接ftp('+FtpServer[0]+':'+FtpServer[1]+')失败'+'\n'
            #FtpConnect.quit()
            continue
        try:
            FtpConnect.login(FtpServer[2], FtpServer[3])
        except:
            ErrorRemark += '\t使用'+FtpServer[2]+','+FtpServer[3]+'登录ftp('+FtpServer[0]+':'+FtpServer[1]+' )失败'+'\n'
            FtpConnect.quit()
            continue
        if 0 < len(FtpServer[4]):
            try:
                FtpConnect.cwd(FtpServer[4])
            except:
                ErrorRemark += '\t重定位到 '+'ftp('+FtpServer[0]+':'+FtpServer[1]+')上的'+FtpServer[4]+'目录失败'+'\n'
                FtpConnect.quit()
                continue

        #
        ZipFileTransCount = 0
        NewZipFile = ''
        ZipFileBasename = ''
        RenameSucess = False
        while ZipFileListCount > CurrZipFilePos:
            #            
            if ZipFileNum <= ZipFileTransCount:
                break;

            #
            if False == os.path.isfile(ZipOutputDir+'/'+ZipFileList[CurrZipFilePos]):
                CurrZipFilePos += 1
                continue
            ZipFileTransCount = ZipFileTransCount+1
            #
            ZipFileBasename = os.path.basename(ZipFileList[CurrZipFilePos])
            if -1 == ZipFileBasename.find('.zip'):
                CurrZipFilePos += 1
                continue
            if -1 != ZipFileBasename.find('.ziping'):
                CurrZipFilePos += 1
                continue
            #
            if -1 == ZipFileBasename.find('.zip|'):
                try:
                    os.rename(ZipOutputDir+'/'+ZipFileList[CurrZipFilePos], ZipOutputDir+'/'+ZipFileList[CurrZipFilePos]+'|'+FtpServer[0])
                except:
                    continue
                NewZipFile = ZipFileList[CurrZipFilePos]+'|'+FtpServer[0]
            else:
                NewZipFile = ZipFileList[CurrZipFilePos]
            ZipFileBasename = os.path.basename(NewZipFile)
            #get name adn dir
            NameInFtp = GetFileNameInFtp(ZipFileBasename)
            ClassDirInFtp = GetDirNameInFtp(ZipFileBasename)
            DataDirInFtp = time.strftime('%Y%m%d/',time.localtime(time.time()))
            DirInFtp = ''
            if 0<len(ClassDirInFtp):
                DirInFtp += 'EntityFile/'+ClassDirInFtp+DataDirInFtp
            #
            #if -1 == ZipFileBasename.find('|'+FtpServer[0]):
            #    continue
            if False == os.path.isfile(ZipOutputDir+'/'+NewZipFile):
                CurrZipFilePos += 1
                continue
            #
            ZipFileBasename = ZipFileBasename.replace('|'+FtpServer[0], '')
            try:
                FtpConnect.storbinary('STOR '+ZipFileBasename+'|'+FtpServer[0], open(ZipOutputDir+'/'+NewZipFile,'rb'))
            except:
                #出错删除文件
                try:
                    FtpConnect.delete(ZipFileBasename+'|'+FtpServer[0])
                except:
                    ErrorRemark += ''
                ErrorRemark += '\t上传文件'+ZipFileBasename+'|'+FtpServer[0]+'到ftp('+FtpServer[0]+')失败'+'\n'
                CurrZipFilePos += 1
                continue
            RenameSucess = True
            try:
                FtpConnect.rename(ZipFileBasename+'|'+FtpServer[0], DirInFtp+NameInFtp)
            except:
                RenameSucess = False
                if 0>=len(DirInFtp):
                    #出错删除文件
                    try:
                        FtpConnect.delete(ZipFileBasename+'|'+FtpServer[0])
                    except:
                        ErrorRemark += ''
                    ErrorRemark += '\t重命名ftp('+FtpServer[0]+')上的文件'+ZipFileBasename+'|'+FtpServer[0]+'失败'+'\n'
                    CurrZipFilePos += 1
                    continue
            #处理目录
            if False==RenameSucess and 0<len(DirInFtp):
                try:
                    FtpConnect.mkd('EntityFile/')
                except:
                    ErrorRemark += '\t在ftp('+FtpServer[0]+')上建立目录'+'EntityFile/'+'失败'+'\n'
                try:
                    FtpConnect.mkd('EntityFile/'+ClassDirInFtp)
                except:
                    ErrorRemark += '\t在ftp('+FtpServer[0]+')上建立目录'+'EntityFile/'+ClassDirInFtp+'失败'+'\n'
                try:
                    FtpConnect.mkd('EntityFile/'+ClassDirInFtp+DataDirInFtp)
                except:
                    ErrorRemark += '\t在ftp('+FtpServer[0]+')上建立目录'+'EntityFile/'+ClassDirInFtp+DataDirInFtp+'失败'+'\n'
                try:
                    FtpConnect.rename(ZipFileBasename+'|'+FtpServer[0], DirInFtp+NameInFtp)
                except:
                    #出错删除文件
                    try:
                        FtpConnect.delete(ZipFileBasename+'|'+FtpServer[0])
                    except:
                        ErrorRemark += ''
                    CurrZipFilePos += 1
                    continue
            #记录文件的个数and大小
            FileNumCount += 1
            FileSizeCount += os.path.getsize(ZipOutputDir+'/'+NewZipFile)
            #将文件移除或者搬走
            try:
                os.remove(ZipOutputDir+'/'+NewZipFile)
            except:
                ErrorRemark += '\t移除文件'+ZipOutputDir+'/'+NewZipFile+'失败\n'
            CurrZipFilePos += 1
        #
        try:
            FtpConnect.quit()
        except:
            ErrorRemark += '\t退出ftp('+FtpServer[0]+')时发生错误'+'\n'
    #
    return FileNumCount,FileSizeCount,ErrorRemark

每天进步一点点、快乐一点点、开心一点点!good,come on!Girl!

猜你喜欢

转载自blog.csdn.net/w1418899532/article/details/84590872