FTP server默認的端口號為21,20端口用於數據傳輸。
本文參考地址:https://docs.python.org/3.6/library/ftplib.html
1. ftplib里包含FTP和FTP_TLS兩個class,后者是封裝了TLS安全傳輸協議的FTP,本文不多描述,查看官網即可,很簡單。
2. ftplib.FTP class就是一個模擬FTP協議客戶端的class,可以使用此class與FTP server進行各種交互,如數據上傳和下載等。
3. FTP的數據傳輸有兩種模式ASCII和binary格式,一般來說使用binary格式更加的普遍,適用場景較多。也因此FTP class最常用的四個method其實是:
FTP.
storbinary
(cmd, fp, blocksize=8192, callback=None, rest=None)FTP.
storlines
(cmd, fp, callback=None)FTP.
retrbinary
(cmd, callback, blocksize=8192, rest=None)FTP.
retrlines
(cmd, callback=None)
其中storbinary與retrbinary就是進行二進制數據傳輸的method。
FTP數據下載:
一般來說,生產上會將ftp用戶的訪問權限限定在自己的家目錄下(可通過修改/etc/vsftpd.conf來改變此行為模式)。
# The FTP class supports the with statement, e.g.: from ftplib import FTP with FTP('<ftp server IP>','user','passwd') as c,\ open('<local filename/local fullpath_filename>','wb') as f: c.retrbinary('RETR <remote ftpserver filename>',f.write) # 直接使用host,user,passwd參數初始化FTP,相當於執行了FTP.connect().login(),簡便起見一般不這么麻煩的寫 # f.closed為True可知文件已自動關閉
FTP class支持python context的with語法,此語法在python中是普遍推薦的,可以幫你自動處理相關對象的上下文,也就是說可以幫你自動關閉相關的對象,防止自己忘了quit or close。
retr開頭的兩個method主要參數是cmd和callback,前者是獲取文件的命令,格式為“RETR filename”,后者即callback為回調函數,一般為openfile.write,表示將相關數據流寫入一個打開的文件,文件打開的方式取決於使用的retr method,例如retrbinary()可以使用'wb'打開的文件。
FTP數據上傳:
相應的數據上傳的函數就是以stor開頭的兩個函數:storbinary與storlines,依然推薦使用前者,二進制總是比較受信任的。
from ftplib import FTP with FTP('<ftp server IP>','user','passwd') as c,\ open('<local filename/local fullpath_filename>','rb') as f: c.storbinary('STOR <remote filename/remote fullpath_filename>',f)
同樣的,上傳文件的CMD格式為“STOR 文件名”。
需要注意的是retr函數使用的是callback函數來將要下載的文件寫入到本地open的文件中,而stor函數則在server端打開一個文件,然后將要上傳的數據寫入。
其他:
關於FTP server常見的returncode,參考:https://kb.globalscape.com/Knowledgebase/10142/FTP-Status-and-Error-Codes
python2時FTP()對象可以不包含可以使用with子句的__enter__,__exit__方法,可以使用如下方式變通:
c = FTP('<ftp server IP>','user','passwd') ... c.quit()