python3從零學習-5.10.9、ftplib—FTP 協議客戶端

源代碼: Lib/ftplib.py

這個模塊定義類FTP和一些相關項。FTP類實現FTP協議的客戶端。您可以使用它編寫Python程序來執行各種自動FTP作業,比如鏡像其他FTP服務器。模塊urllib也使用它。請求處理使用FTP的url。有關FTP(文件傳輸協議)的更多信息,請參見Internet RFC 959。

 

下面是一個使用ftplib模塊的示例會話:

>>> from ftplib import FTP
>>> ftp = FTP('ftp.debian.org')     # connect to host, default port
>>> ftp.login()                     # user anonymous, passwd anonymous@
'230 Login successful.'
>>> ftp.cwd('debian')               # change into "debian" directory
>>> ftp.retrlines('LIST')           # list directory contents
-rw-rw-r--    1 1176     1176         1063 Jun 15 10:18 README
...
drwxr-sr-x    5 1176     1176         4096 Dec 19  2000 pool
drwxr-sr-x    4 1176     1176         4096 Nov 17  2008 project
drwxr-xr-x    3 1176     1176         4096 Oct 10  2012 tools
'226 Directory send OK.'
>>> ftp.retrbinary('RETR README', open('README', 'wb').write)
'226 Transfer complete.'
>>> ftp.quit()

這個模塊定義了以下內容:

 

class ftplib.FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None)

返回FTP類的新實例。當給定host時,就會調用connect(host)方法。在給定user時,另外會執行方法調用login(user、passwd、acct)(其中passwd和acct在未給定時默認爲空字符串)。可選的超時參數指定阻塞操作(如連接嘗試)的超時時間(以秒爲單位)(如果未指定,將使用全局默認超時設置)。source_address是套接字在連接之前要綁定到的一個2元組(主機、端口)。

 

class ftplib.FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None)

RFC 4217中描述的一個FTP子類,它將TLS支持添加到FTP中。像往常一樣連接到端口21,在身份驗證之前隱式地保護FTP控制連接。保護數據連接需要用戶通過調用prot_p()方法顯式地請求它。上下文是一個ssl。對象,允許將SSL配置選項、證書和私鑰綁定到單個(可能是長期存在的)結構中。請閱讀安全考慮最佳做法。

 

keyfile和certfile是上下文的遺留替代方案——它們可以(分別)指向SSL連接的py格式的私鑰和證書鏈文件。

 

exception ftplib.error_reply

當從服務器接收到意外的應答時引發異常。

 

exception ftplib.error_temp

當接收到表示臨時錯誤的錯誤碼(響應碼在400-499之間)時引發異常。

 

exception ftplib.error_perm

當收到表示永久錯誤的錯誤代碼(響應代碼在500-599之間)時引發異常。

 

exception ftplib.error_proto

當從服務器接收到不符合文件傳輸協議響應規範(即以1-5範圍內的數字開頭)的回覆時引發異常。

 

ftplib.all_errors

所有異常的集合(作爲元組),FTP實例的方法可能由於FTP連接問題(與調用者所犯的編程錯誤相反)而引發這些異常。這個集合包括上面列出的四個異常以及OSError。

FTP 對象

有兩種方法可用:一種用於處理文本文件,另一種用於處理二進制文件。它們以命令命名,文本版本使用命令後跟行,二進制版本使用二進制。

 

FTP實例有以下方法:

FTP.set_debuglevel(level)

設置實例的調試級別。它控制打印的調試輸出的數量。默認值0不產生任何調試輸出。值爲1會產生適當數量的調試輸出,通常每個請求只有一行。2或更高的值將生成調試輸出的最大數量,記錄控制連接上發送和接收的每一行。

 

FTP.connect(host='', port=0, timeout=None, source_address=None)

連接到給定的主機和端口。默認端口號是21,由FTP協議規範指定。很少需要指定不同的端口號。對於每個實例,該函數只能調用一次;如果在創建實例時提供了主機,則根本不應該調用它。所有其他方法只能在建立連接之後使用。可選的超時參數指定連接嘗試的超時時間(秒)。如果沒有超時,將使用全局默認超時設置。source_address是套接字在連接之前要綁定到的一個2元組(主機、端口)。

 

FTP.getwelcome()

返回服務器爲響應初始連接而發送的歡迎消息。(此消息有時包含可能與用戶相關的免責聲明或幫助信息。)

 

FTP.login(user='anonymous', passwd='', acct='')

作爲給定的用戶登錄。passwd和acct參數是可選的,默認爲空字符串。如果沒有指定用戶,默認爲“匿名”。如果用戶是“匿名”,默認密碼是“anonymous@”。在建立連接之後,每個實例只應該調用該函數一次;如果在創建實例時提供了主機和用戶,則根本不應該調用該實例。大多數FTP命令只允許在客戶端登錄後執行。會計參數提供“會計信息”;很少有系統實現這一點。

 

FTP.abort()

中止正在進行的文件傳輸。使用這種方法並不總是有效,但值得一試。

 

FTP.sendcmd(cmd)

向服務器發送一個簡單的命令字符串並返回響應字符串。

 

FTP.voidcmd(cmd)

向服務器發送一個簡單的命令字符串並處理響應。如果收到與成功對應的響應代碼(範圍爲200-299),則不返回任何內容。提高error_reply否則。

 

FTP.retrbinary(cmd, callback, blocksize=8192, rest=None)

檢索二進制傳輸模式的文件。cmd應該是一個適當的RETR命令:'RETR filename'。對接收到的每個數據塊調用回調函數,並使用單個字節參數給出數據塊。可選的blocksize參數指定在創建來執行實際傳輸的低級套接字對象上讀取的最大塊大小(它也將是傳遞給回調的數據塊的最大大小)。選擇一個合理的默認值。rest的意思與transfercmd()方法中的意思相同。

 

FTP.retrlines(cmd, callback=None)

檢索ASCII傳輸模式下的文件或目錄列表。cmd應該是一個合適的RETR命令(參見retrbinary()),或者一個命令,比如LIST或NLST(通常只是字符串'LIST')。LIST檢索文件列表和有關這些文件的信息。NLST檢索文件名列表。對每一行調用回調函數,其中的字符串參數包含尾部去掉CRLF的行。默認的回調將該行打印到sys.stdout。

 

FTP.set_pasv(val)

如果val爲真,啓用“被動”模式,否則禁用被動模式。被動模式默認是開啓的。

 

FTP.storbinary(cmd, fp, blocksize=8192, callback=None, rest=None)

以二進制傳輸模式存儲文件。cmd應該是一個合適的STOR命令:“STOR文件名”。fp是一個文件對象(以二進制模式打開),直到EOF使用它的read()方法在區塊大小塊中提供要存儲的數據。blocksize參數默認值爲8192。callback是一個可調用的可選參數,在每個數據塊被髮送後被調用。rest的意思與transfercmd()方法中的意思相同。

 

FTP.storlines(cmd, fp, callback=None)

以ASCII傳輸模式存儲文件。cmd應該是一個合適的STOR命令(參見storbinary())。使用readline()方法從文件對象fp(以二進制模式打開)中讀取行直到EOF,以提供要存儲的數據。callback是一個可調用的可選參數,在每一行發送後調用。

 

FTP.transfercmd(cmd, rest=None)

啓動數據連接上的傳輸。如果傳輸是活動的,發送EPRT或端口命令和cmd指定的傳輸命令,並接受連接。如果服務器是被動的,發送EPSV或PASV命令,連接到它,並啓動transfer命令。無論哪種方式,都返回連接的套接字。

 

如果提供了可選的rest,則將rest命令發送到服務器,並將rest作爲參數傳遞。rest通常是請求文件中的一個字節偏移量,它告訴服務器在請求的偏移量處重新開始發送文件的字節,跳過初始字節。但是請注意,RFC 959只要求rest是包含可打印範圍從ASCII碼33到ASCII碼126的字符的字符串。因此,transfercmd()方法將rest轉換爲字符串,但是不檢查字符串的內容。如果服務器不識別REST命令,將引發error_reply異常。如果發生這種情況,只需調用transfercmd()而不使用rest參數。

 

FTP.ntransfercmd(cmd, rest=None)

啓動數據連接上的傳輸。如果傳輸是活動的,發送EPRT或端口命令和cmd指定的傳輸命令,並接受連接。如果服務器是被動的,發送EPSV或PASV命令,連接到它,並啓動transfer命令。無論哪種方式,都返回連接的套接字。

 

與transfercmd()類似,但是返回數據連接的元組和數據的預期大小。如果無法計算預期大小,則不會返回預期大小。cmd和rest與transfercmd()中的意思相同。

 

FTP.mlsd(path="", facts=[])

使用MLSD命令(RFC 3659)以標準格式列出目錄。如果路徑被省略,則假設當前目錄。事實是一個字符串列表,表示所需的信息類型(如["type", "size", "perm"])。返回一個生成器對象,爲在path中找到的每個文件生成兩個元素的元組。第一個元素是文件名,第二個元素是包含關於文件名事實的字典。這個字典的內容可能受到事實參數的限制,但是服務器不能保證返回所有請求的事實。

 

FTP.nlst(argument[, ...])

返回由NLST命令返回的文件名列表。可選參數是要列出的目錄(默認是當前服務器目錄)。可以使用多個參數將非標準選項傳遞給NLST命令。

 

FTP.dir(argument[, ...])

生成LIST命令返回的目錄列表,並將其打印到標準輸出。可選參數是要列出的目錄(默認是當前服務器目錄)。可以使用多個參數將非標準選項傳遞給LIST命令。如果最後一個參數是一個函數,它被用作回調函數,就像retrlines();默認輸出到sys.stdout。此方法返回None。

 

FTP.rename(fromname, toname)

將服務器上的文件從name重命名爲toname。

 

FTP.delete(filename)

從服務器中刪除名爲filename的文件。如果成功,返回響應的文本,否則在權限錯誤時引發error_perm,或在其他錯誤時引發error_reply。

 

FTP.cwd(pathname)

設置服務器上的當前目錄。

 

FTP.mkd(pathname)

在服務器上創建一個新目錄。

 

FTP.pwd()

返回服務器上當前目錄的路徑名。

 

FTP.rmd(dirname)

刪除服務器上名爲dirname的目錄。

 

FTP.size(filename)

請求服務器上名爲filename的文件的大小。如果成功,文件的大小將以整數的形式返回,否則將不返回。注意,SIZE命令不是標準化的,但是許多常見的服務器實現都支持它。

 

FTP.quit()

向服務器發送一個QUIT命令並關閉連接。這是關閉連接的“禮貌”方式,但如果服務器對QUIT命令響應錯誤,則可能引發異常。這意味着對close()方法的調用將使FTP實例對後續調用無效(參見下面)。

 

FTP.close()

單方面關閉連接。這不應該應用於已經關閉的連接,比如成功調用quit()之後。在此調用之後,不應該再使用FTP實例(在調用close()或quit()之後,您不能通過發出另一個login()方法來重新打開連接)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章