ftplib模块的主要接口
# from ftplib import FTP #加载ftp模块 # ftp=FTP() #设置变量 # ftp.set_debuglevel(2) #打开调试级别2,显示详细信息 # ftp.set_debuglevel(0) #关闭调试模式 # ftp.connect("IP","port") #连接的ftp sever和端口 # ftp.login("user","password") #连接的用户名,密码 # ftp.getwelcome() #打印出欢迎信息 # ftp.cmd("xxx/xxx") #进入远程目录 # ftp.quit() #退出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_handel,bufsize) #上传目标文件 # ftp.retrbinary("RETR filename.txt",file_handel,bufsize) #下载FTP文件 # ftp.size(filename) #获取文件大小(字节) # ftp.delete(filename) #删除服务器上的文件
上传和下载文件
import socket from ftplib import FTP, error_perm def ftpconnect(host, port, username, password): ftp = FTP() ftp.set_debuglevel(0) try: ftp.connect(host, port) ftp.login(username, password) except (socket.error, socket.gaierror): print("ERROR: cannot connect [{}:{}]" .format(host, port)) return None except error_perm: print("ERROR: user Authentication failed") return None except: print("ERROR: Unknow") return None return ftp def downloadfile(ftp, remotepath, localpath): bufsize = 1024 with open(localpath, 'wb') as fp: ftp.retrbinary('RETR ' + remotepath, fp.write, bufsize) def uploadfile(ftp, remotepath, localpath): bufsize = 1024 with open(localpath, 'rb') as fp: ftp.storbinary('STOR ' + remotepath, fp, bufsize) if __name__ == "__main__": ftp = ftpconnect("192.180.180.100", 21, "admin", "zhongxing") downloadfile(ftp, "/home/sd/NCP_AGENT", "NCP_AGENT") ftp.quit()
思考:怎么获取文件传输过程中的进度
由于ftplib中的storbinary和retrbinary接口是阻塞式,返回值表示成功或失败。因此实时获取进度需要创建另外一个任务,如果是下载,实时进度可以使用已下载的文件大小除以总的文件大小;如果是上传,需要另启一个ftp连接,使用size接口获取上传文件的实时大小,然后除以上传文件的总大小即可得到实时进度。上述的方式比较麻烦,但是简单,不用修改源码,另一种方式是修改ftplib的源码,在每一帧的发送过程中做处理,使用全局变量传出即可。