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的源碼,在每一幀的發送過程中做處理,使用全局變量傳出即可。