ftplib-python与ftp交互

ftplib-python与ftp交互

ftplib-python与ftp交互

ftplib是python默认安装的一个python模块,可以用来简单实现ftp客户端,用于上传或下载文件。

相关方法

  • ftp登录链接
from ftplib import FTP #加载ftp模块
ftp = FTP() #初始化一个对象
ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
ftp.connect("IP","port") #链接ftp server 和端口
ftp.login('user','password') # 登录用户名和密码
print(ftp.getwelcome) #打印欢迎信息

ftp.cmd('xxx/xxx') # 进入远程目录
bufsize = 1024 #设置缓冲区大小
filename = 'filename.txt' #需要下载的文件名
file_handle = open(filename,'wb').write # 以写模式在本地打开文件

file.retrbinaly("RETR filename.txt',file_handle,bufsize) # 接受服务器上文件并写入本地文件
ftp.set_debuglevel(0) # 关闭调试模式
ftp.quit() #退出ftp

  • ftp相关命令操作

ftp.cwd(pathname) # 设置FTP当前操作的路径
ftp.dir() # 显示目录下所有目录的信息
ftp.nlst() # 获取目录下的文件
ftp.mkd(pathname) #新建远程目录
ftp.pwd() #返回当前所在位置
ftp.rmd(dirname)  # 删除远程目录
ftp.delete(filename) # 删除远程文件
ftp.rename(fromname,toname) # 将fromname修改为toname
ftp.storbinary('STOR filename.txt',file_handle,bufsize)#上传目标文件
ftp.retbinary('RETR filename.txt',file_handle,bufsize) # 下载ftp文件

ftp.quit() # 发送quit命令给服务器并关闭连接
ftp.close() # 单方面的关闭连接,不应该在ftp.quit()之后

Example1: 下载,上传文件

from ftlib import FTP
import time
import tarfile

def ftpconnect(host,username,password):
    ftp = FTP()
    ftp.set_debuglevel(2)
    ftp.connect(host,21)
    ftp.login(username,password)
    
    return ftp

def downloadfile(ftp,remotepath,localpath):
    bufsize = 1024
    fp = open(localpath,'wb')
    ftp.retrbinary('RETR  '+ remotepath,fp.write,bufsize)
    # 接受服务器上文件并写入文本
    ftp.set_debuglevel(0) # 关闭调试
    fp.close() # 关闭文件


def uploadfile(ftp,remotepath,localpath):
    bufsize = 1024
    fp = open(localpath,'rb')
    ftp.storbinary('STOR '+ remotepath, fp,bufsize) # 上传文件
    ftp.set_debuglevel(0)
    fp.close()

if __name__ == "__main__":
    ftp = ftpconnect("xxxxx","xxx","xxxxx")
    downloadfile(ftp,"XXX","XXX")
    uploadfile(ftp,"xxxx","xxxxx")

    ftp.quit()

Example2: 上传,下载文件/目录

from ctypes import *
import os
import sys
import ftplib


class myFTP():
    ftp = ftplib.FTP()
    bIsDir = False
    path = ""
    
    def __init__(self,host,port='21'):
        self.ftp.set_debuglevel(2)
        self.ftp.set_pasv(0) # 0主动模式,1被动模式
        self.ftp.connect(host,port)

    def Login(self,user,password):
        self.ftp.login(user,password)
        print(self.ftp.welcome)

    def DownloadFile(self,LocalFile,RemoteFile):
        file_handler = open(LocalFile,'wb')
        self.ftp.retrbinary("RETR s%' %(RemoteFile),file_handler.write)
        fle_handler.close()
        return 


    def UpLoadFile(self,LocalFile,RemoteFile):
        if os.path.isfile(LocalFile) == False:
             raise "这不是一个合法的文件路径" 
        file_handler = open(LocalFile,"rb")
        self.ftp.storbinary('STOR s%' % RemoteFile,file_handler,bufSize = 4096)
        file_handler.close()
        return         

    def UpLoadFileTree(self, LocalDir, RemoteDir):
        if os.path.isdir(LocalDir) == False:
            raise "这不是一个合法的文件夹路径"
        LocalNames = os.listdir(LocalDir)
        self.ftp.cwd( RemoteDir )
        for Local in LocalNames:
            src = os.path.join( LocalDir, Local)
            if os.path.isdir( src ): 
                self.UpLoadFileTree( src, Local )
            else:
                self.UpLoadFile( src, Local )

        self.ftp.cwd( ".." )
        return
    

    def DownLoadFileTree(self, LocalDir, RemoteDir):
        if os.path.isdir( LocalDir ) == False:
            os.makedirs( LocalDir )
        self.ftp.cwd( RemoteDir )
        RemoteNames = self.ftp.nlst()  

        for file in RemoteNames:
            Local = os.path.join( LocalDir, file )
            if self.isDir( file ):
                self.DownLoadFileTree( Local, file )                
            else:
                self.DownLoadFile( Local, file )
        self.ftp.cwd( ".." )
        return


    def show(self, list):
        result = list.lower().split( " " )
        if self.path in result and "<dir>" in result:
            self.bIsDir = True


    def isDir(self, path):
        self.bIsDir = False
        self.path = path
        #this ues callback function ,that will change bIsDir value
        self.ftp.retrlines( 'LIST', self.show )
        return self.bIsDir

    def close(self):
        self.ftp.quit()

if __name__ == "__main__":
    ftp = myFtp('*****')
    ftp.Login('***','***')

    ftp.DownLoadFileTree('del', '/del1')#ok
    ftp.UpLoadFileTree('del', "/del1" )
    ftp.close()
    print "ok!"

Example3: 异常处理

import ftplib
from ftplib imort FTP
import socket
import os


def ftpconnect(ftp_info):
    try:
        ftp = ftplib.FTP(ftp_info[0])
    except (socket.error, socket.gaierror):
        raise "ERROR: cannot reach %s" % ftp_info[0]
        return 

    username = ftp_info[1]
    passwd = ftp_info[2]
    try:
        ftp.login(username, passwd)
    except ftplib.error_perm:
        raise "ERROR: cannot login anonymously"
        ftp.quit()
        return 
    return ftp

if __name__ == "__main__":
    info_list = ["10.19.3.199", "fastupdate_amap", "@utonavi&A.map"]
    ftp = ftpconnect(info_list)
    if not ftp:
        exit(1)
    bufsize = 1024
    fname = "20150416113942674.tar.gz"
    fp = open(os.path.join(".", fname), 'wb')
    remotefile = os.path.join("/ADF++", fname)
    ftp.retrbinary("RETR " + remotefile, fp.write, bufsize)

    #是否有目录,没有就创建;有的话看是否有权限创建
    a = ftp.dir()
    try:
        ftp.cwd("jimi")
    except ftplib.error_perm:
        try:
            ftp.mkd("jimi")
        except ftplib.error_perm:
            print "WARNING: U have no authority to make dir"
    finally:
        ftp.quit()

参考:

[1]. FTP例子

[2]. python ftplib

[3]. ftplib官网

Author face

徐静

数据科学从业者,数据分析师. 善于用数据科学的工具透析业务,模型的线上化部署,网络爬虫及前端可视化. 喜欢研究机器学习,深度学习及相关软件实现.目前自己还是小白一个,希望多多学习.

最近发表的文章