ftplib --- FTP 協(xié)議客戶端?

源代碼: Lib/ftplib.py


本模塊定義了 FTP 類和一些相關(guān)項(xiàng)目。 FTP 類實(shí)現(xiàn)了 FTP 協(xié)議的客戶端。 你可以用這個類來編寫執(zhí)行各種自動化 FTP 任務(wù)的 Python 程序,例如鏡像其他 FTP 服務(wù)器等。 它還被 urllib.request 模塊用來處理使用 FTP 的 URL。 有關(guān) FTP (文件傳輸協(xié)議) 的更多信息,請參閱 RFC 959。

默認(rèn)編碼為 UTF-8,遵循 RFC 2640。

以下是使用 ftplib 模塊的會話示例:

>>>
>>> from ftplib import FTP
>>> ftp = FTP('ftp.us.debian.org')  # connect to host, default port
>>> ftp.login()                     # user anonymous, passwd anonymous@
'230 Login successful.'
>>> ftp.cwd('debian')               # change into "debian" directory
'250 Directory successfully changed.'
>>> 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.'
>>> with open('README', 'wb') as fp:
>>>     ftp.retrbinary('RETR README', fp.write)
'226 Transfer complete.'
>>> ftp.quit()
'221 Goodbye.'

這個模塊定義了以下內(nèi)容:

class ftplib.FTP(host='', user='', passwd='', acct='', timeout=None, source_address=None, *, encoding='utf-8')?

返回一個 FTP 類的新實(shí)例。當(dāng)傳入 host 時,將調(diào)用 connect(host) 方法。當(dāng)傳入 user 時,將額外調(diào)用 login(user, passwd, acct) 方法(其中 passwdacct 若沒有傳入則默認(rèn)為空字符串)??蛇x參數(shù) timeout 指定阻塞操作(如連接嘗試)的超時(以秒為單位,如果未指定超時,將使用全局默認(rèn)超時設(shè)置)。source_address 是一個 2 元組 (host, port),套接字在連接前綁定它,作為其源地址。encoding 參數(shù)指定目錄和文件名的編碼。

FTP 類支持 with 語句,例如:

>>>
>>> from ftplib import FTP
>>> with FTP("ftp1.at.proftpd.org") as ftp:
...     ftp.login()
...     ftp.dir()
... 
'230 Anonymous login ok, restrictions apply.'
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 .
dr-xr-xr-x   9 ftp      ftp           154 May  6 10:43 ..
dr-xr-xr-x   5 ftp      ftp          4096 May  6 10:43 CentOS
dr-xr-xr-x   3 ftp      ftp            18 Jul 10  2008 Fedora
>>>

在 3.2 版更改: 添加了對 with 語句的支持。

在 3.3 版更改: 添加了 source_address 參數(shù)。

在 3.9 版更改: 如果 timeout 參數(shù)設(shè)置為 0,創(chuàng)建非阻塞套接字時,它將引發(fā) ValueError 來阻止該操作。添加了 encoding 參數(shù),且為了遵循 RFC 2640,該參數(shù)默認(rèn)值從 Latin-1 改為了 UTF-8。

class ftplib.FTP_TLS(host='', user='', passwd='', acct='', keyfile=None, certfile=None, context=None, timeout=None, source_address=None, *, encoding='utf-8')?

一個 FTP 的子類,它為 FTP 添加了 TLS 支持,如 RFC 4217 所述。它將像通常一樣連接到 21 端口,暗中保護(hù)在身份驗(yàn)證前的 FTP 控制連接。而保護(hù)數(shù)據(jù)連接需要用戶明確調(diào)用 prot_p() 方法。context 是一個 ssl.SSLContext 對象,該對象可以將 SSL 配置選項(xiàng)、證書和私鑰打包放入一個單獨(dú)的(可以長久存在的)結(jié)構(gòu)中。請閱讀 安全考量 以獲取最佳實(shí)踐。

keyfilecertfile 是可以代替 context 的傳統(tǒng)方案,它們可以分別指向 PEM 格式的私鑰和證書鏈文件,用于進(jìn)行 SSL 連接。

3.2 新版功能.

在 3.3 版更改: 添加了 source_address 參數(shù)。

在 3.4 版更改: 本類現(xiàn)在支持使用 ssl.SSLContext.check_hostname服務(wù)器名稱指示 (參閱 ssl.HAS_SNI)進(jìn)行主機(jī)名檢查。

3.6 版后已移除: keyfilecertfile 已棄用并轉(zhuǎn)而推薦 context。 請改用 ssl.SSLContext.load_cert_chain() 或讓 ssl.create_default_context() 為你選擇系統(tǒng)所信任的 CA 證書。

在 3.9 版更改: 如果 timeout 參數(shù)設(shè)置為 0,創(chuàng)建非阻塞套接字時,它將引發(fā) ValueError 來阻止該操作。添加了 encoding 參數(shù),且為了遵循 RFC 2640,該參數(shù)默認(rèn)值從 Latin-1 改為了 UTF-8。

以下是使用 FTP_TLS 類的會話示例:

>>>
>>> ftps = FTP_TLS('ftp.pureftpd.org')
>>> ftps.login()
'230 Anonymous user logged in'
>>> ftps.prot_p()
'200 Data protection level set to "private"'
>>> ftps.nlst()
['6jack', 'OpenBSD', 'antilink', 'blogbench', 'bsdcam', 'clockspeed', 'djbdns-jedi', 'docs', 'eaccelerator-jedi', 'favicon.ico', 'francotone', 'fugu', 'ignore', 'libpuzzle', 'metalog', 'minidentd', 'misc', 'mysql-udf-global-user-variables', 'php-jenkins-hash', 'php-skein-hash', 'php-webdav', 'phpaudit', 'phpbench', 'pincaster', 'ping', 'posto', 'pub', 'public', 'public_keys', 'pure-ftpd', 'qscan', 'qtc', 'sharedance', 'skycache', 'sound', 'tmp', 'ucarp']
exception ftplib.error_reply?

從服務(wù)器收到意外答復(fù)時,將引發(fā)本異常。

exception ftplib.error_temp?

收到表示臨時錯誤的錯誤代碼(響應(yīng)代碼在 400--499 范圍內(nèi))時,將引發(fā)本異常。

exception ftplib.error_perm?

收到表示永久性錯誤的錯誤代碼(響應(yīng)代碼在 500--599 范圍內(nèi))時,將引發(fā)本異常。

exception ftplib.error_proto?

從服務(wù)器收到不符合 FTP 響應(yīng)規(guī)范的答復(fù),比如以數(shù)字 1--5 開頭時,將引發(fā)本異常。

ftplib.all_errors?

所有異常的集合(一個元組),由于 FTP 連接出現(xiàn)問題(并非調(diào)用者的編碼錯誤),FTP 實(shí)例的方法可能會引發(fā)這些異常。該集合包括上面列出的四個異常以及 OSErrorEOFError

參見

netrc 模塊

.netrc 文件格式解析器。FTP 客戶端在響應(yīng)用戶之前,通常使用 .netrc 文件來加載用戶認(rèn)證信息。

FTP 對象?

一些方法可以按照兩種方式來使用:一種處理文本文件,另一種處理二進(jìn)制文件。方法名稱與相應(yīng)的命令相同,文本版中命令后面跟著 lines,二進(jìn)制版中命令后面跟著 binary。

FTP 實(shí)例具有下列方法:

FTP.set_debuglevel(level)?

設(shè)置實(shí)例的調(diào)試級別,它控制著調(diào)試信息的數(shù)量。默認(rèn)值 0 不產(chǎn)生調(diào)試信息。值 1 產(chǎn)生中等數(shù)量的調(diào)試信息,通常每個請求產(chǎn)生一行。大于或等于 2 的值產(chǎn)生的調(diào)試信息最多,F(xiàn)TP 控制連接上發(fā)送和接收的每一行都將被記錄下來。

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

連接到給定的主機(jī)和端口。默認(rèn)端口號由 FTP 協(xié)議規(guī)范規(guī)定,為 21。偶爾才需要指定其他端口號。每個實(shí)例只應(yīng)調(diào)用一次本函數(shù),如果在創(chuàng)建實(shí)例時就傳入了 host,則根本不應(yīng)調(diào)用它。所有其他方法只能在建立連接后使用。可選參數(shù) timeout 指定連接嘗試的超時(以秒為單位)。如果沒有傳入 timeout,將使用全局默認(rèn)超時設(shè)置。source_address 是一個 2 元組 (host, port),套接字在連接前綁定它,作為其源地址。

引發(fā)一個 審計(jì)事件 ftplib.connect,附帶參數(shù) self, host, port。

在 3.3 版更改: 添加了 source_address 參數(shù)。

FTP.getwelcome()?

返回服務(wù)器發(fā)送的歡迎消息,作為連接開始的回復(fù)。(該消息有時包含與用戶有關(guān)的免責(zé)聲明或幫助信息。)

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

user 的身份登錄。passwdacct 是可選參數(shù),默認(rèn)為空字符串。如果沒有指定 user,則默認(rèn)為 'anonymous'。如果 user'anonymous',那么默認(rèn)的 passwd'anonymous@'。連接建立后,每個實(shí)例只應(yīng)調(diào)用一次本函數(shù);如果在創(chuàng)建實(shí)例時傳入了 host 和 user,則完全不應(yīng)該調(diào)用本函數(shù)。在客戶端登錄后,才允許執(zhí)行大多數(shù) FTP 命令。acct 參數(shù)提供記賬信息 ("accounting information");僅少數(shù)系統(tǒng)實(shí)現(xiàn)了該特性。

FTP.abort()?

中止正在進(jìn)行的文件傳輸。本方法并不總是有效,但值得一試。

FTP.sendcmd(cmd)?

將一條簡單的命令字符串發(fā)送到服務(wù)器,返回響應(yīng)的字符串。

引發(fā)一個 審計(jì)事件 ftplib.sendcmd,附帶參數(shù) self, cmd。

FTP.voidcmd(cmd)?

將一條簡單的命令字符串發(fā)送到服務(wù)器,并處理響應(yīng)內(nèi)容。如果收到的響應(yīng)代碼表示的是成功(代碼范圍 200--299),則不返回任何內(nèi)容。否則將引發(fā) error_reply

引發(fā)一個 審計(jì)事件 ftplib.sendcmd,附帶參數(shù) self, cmd

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

以二進(jìn)制傳輸模式下載文件。cmd 應(yīng)為恰當(dāng)?shù)?RETR 命令:'RETR 文件名'callback 函數(shù)會在收到每個數(shù)據(jù)塊時調(diào)用,傳入的參數(shù)是表示數(shù)據(jù)塊的一個字節(jié)。為執(zhí)行實(shí)際傳輸,創(chuàng)建了底層套接字對象,可選參數(shù) blocksize 指定了讀取該對象時的最大塊大?。ㄟ@也是傳入 callback 的數(shù)據(jù)塊的最大大?。?。已經(jīng)選擇了合理的默認(rèn)值。rest 的含義與 transfercmd() 方法中的含義相同。

FTP.retrlines(cmd, callback=None)?

按照初始化時的 encoding 參數(shù)指定的編碼,獲取文件或目錄列表。cmd 應(yīng)是恰當(dāng)?shù)?RETR 命令(參閱 retrbinary()),也可以是諸如 LISTNLST 之類的命令(通常就只是字符串 'LIST')。LIST 獲取文件列表以及那些文件的信息。NLST 獲取文件名稱列表。callback 函數(shù)會在每一行都調(diào)用,參數(shù)就是包含一行的字符串,刪除了尾部的 CRLF。默認(rèn)的 callback 會把行打印到 sys.stdout。

FTP.set_pasv(val)?

如果 val 為 true,則打開“被動”模式,否則禁用被動模式。默認(rèn)下被動模式是打開的。

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

以二進(jìn)制傳輸模式存儲文件。 cmd 應(yīng)為恰當(dāng)?shù)?STOR 命令: "STOR filename"。fp 是一個 文件對象 (以二進(jìn)制模式打開),將使用它的 read() 方法讀取它,用于提供要存儲的數(shù)據(jù),直到遇到 EOF,讀取時的塊大小為 blocksize。 參數(shù) blocksize 的默認(rèn)值為 8192。 可選參數(shù) callback 是單參數(shù)函數(shù),在每個數(shù)據(jù)塊發(fā)送后都會以該數(shù)據(jù)塊作為參數(shù)來調(diào)用它。rest 的含義與 transfercmd() 方法中的含義相同。

在 3.2 版更改: 添加了 rest 參數(shù)。

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

以文本行模式存儲文件。cmd 應(yīng)為恰當(dāng)?shù)?STOR 命令 (請參閱 storbinary())。 fp 是一個 文件對象 (以二進(jìn)制模式打開),將使用它的 readline() 方法讀取它的每一行,用于提供要存儲的數(shù)據(jù),直到遇到 EOF。 可選參數(shù) callback 是單參數(shù)函數(shù),在每行發(fā)送后都會以該行作為參數(shù)來調(diào)用它。

FTP.transfercmd(cmd, rest=None)?

在 FTP 數(shù)據(jù)連接上開始傳輸數(shù)據(jù)。如果傳輸處于活動狀態(tài),傳輸命令由 cmd 指定,需發(fā)送 EPRTPORT 命令,然后接受連接 (accept)。如果服務(wù)器是被動服務(wù)器,需發(fā)送 EPSVPASV 命令,連接到服務(wù)器 (connect),然后啟動傳輸命令。兩種方式都將返回用于連接的套接字。

如果傳入了可選參數(shù) rest,則一條 REST 命令會被發(fā)送到服務(wù)器,并以 rest 作為參數(shù)。rest 通常表示請求文件中的字節(jié)偏移量,它告訴服務(wù)器重新開始發(fā)送文件的字節(jié),從請求的偏移量處開始,跳過起始字節(jié)。但是請注意,transfercmd() 方法會將 rest 轉(zhuǎn)換為字符串,但是不檢查字符串的內(nèi)容,轉(zhuǎn)換用的編碼是在初始化時指定的 encoding 參數(shù)。如果服務(wù)器無法識別 REST 命令,將引發(fā) error_reply 異常。如果發(fā)生這種情況,只需不帶 rest 參數(shù)調(diào)用 transfercmd()。

FTP.ntransfercmd(cmd, rest=None)?

類似于 transfercmd(),但返回一個元組,包括數(shù)據(jù)連接和數(shù)據(jù)的預(yù)計(jì)大小。如果預(yù)計(jì)大小無法計(jì)算,則返回的預(yù)計(jì)大小為 Nonecmdrest 的含義與 transfercmd() 中的相同。

FTP.mlsd(path='', facts=[])?

使用 MLSD 命令以標(biāo)準(zhǔn)格式列出目錄內(nèi)容 (RFC 3659)。如果省略 path 則使用當(dāng)前目錄。facts 是字符串列表,表示所需的信息類型(如 ["type", "size", "perm"])。返回一個生成器對象,每個在 path 中找到的文件都將在該對象中生成兩個元素的元組。第一個元素是文件名,第二個元素是該文件的 facts 的字典。該字典的內(nèi)容受 facts 參數(shù)限制,但不能保證服務(wù)器會返回所有請求的 facts。

3.3 新版功能.

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

返回一個文件名列表,文件名由 NLST 命令返回??蛇x參數(shù) argument 是待列出的目錄(默認(rèn)為當(dāng)前服務(wù)器目錄)??梢允褂枚鄠€參數(shù),將非標(biāo)準(zhǔn)選項(xiàng)傳遞給 NLST 命令。

備注

如果目標(biāo)服務(wù)器支持相關(guān)命令,那么 mlsd() 提供的 API 更好。

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

生成目錄列表,即 LIST 命令所返回的結(jié)果,并將其打印到標(biāo)準(zhǔn)輸出??蛇x參數(shù) argument 是待列出的目錄(默認(rèn)為當(dāng)前服務(wù)器目錄)??梢允褂枚鄠€參數(shù),將非標(biāo)準(zhǔn)選項(xiàng)傳遞給 LIST 命令。如果最后一個參數(shù)是一個函數(shù),它將被用作 callback 函數(shù),與 retrlines() 中的相同,默認(rèn)將打印到 sys.stdout。本方法返回 None

備注

如果目標(biāo)服務(wù)器支持相關(guān)命令,那么 mlsd() 提供的 API 更好。

FTP.rename(fromname, toname)?

將服務(wù)器上的文件 fromname 重命名為 toname。

FTP.delete(filename)?

將服務(wù)器上名為 filename 的文件刪除。如果刪除成功,返回響應(yīng)文本,如果刪除失敗,在權(quán)限錯誤時引發(fā) error_perm,在其他錯誤時引發(fā) error_reply。

FTP.cwd(pathname)?

設(shè)置服務(wù)器端的當(dāng)前目錄。

FTP.mkd(pathname)?

在服務(wù)器上創(chuàng)建一個新目錄。

FTP.pwd()?

返回服務(wù)器上當(dāng)前目錄的路徑。

FTP.rmd(dirname)?

將服務(wù)器上名為 dirname 的目錄刪除。

FTP.size(filename)?

請求服務(wù)器上名為 filename 的文件大小。成功后以整數(shù)返回文件大小,未成功則返回 None。注意,SIZE 不是標(biāo)準(zhǔn)命令,但通常許多服務(wù)器的實(shí)現(xiàn)都支持該命令。

FTP.quit()?

向服務(wù)器發(fā)送 QUIT 命令并關(guān)閉連接。 這是關(guān)閉一個連接的“禮貌”方式,但是如果服務(wù)器對 QUIT 命令的響應(yīng)帶有錯誤消息則這會引發(fā)一個異常。 這意味著對 close() 方法的調(diào)用,它將使得 FTP 實(shí)例對后繼調(diào)用無效(見下文)。

FTP.close()?

單方面關(guān)閉連接。 這不該被應(yīng)用于已經(jīng)關(guān)閉的連接,例如成功調(diào)用 quit() 之后的連接。 在此調(diào)用之后 FTP 實(shí)例不應(yīng)被繼續(xù)使用(在調(diào)用 close()quit() 之后你不能通過再次發(fā)起調(diào)用 login() 方法重新打開連接)。

FTP_TLS 對象?

FTP_TLS 類繼承自 FTP,它定義了下述其他對象:

FTP_TLS.ssl_version?

欲采用的 SSL 版本(默認(rèn)為 ssl.PROTOCOL_SSLv23)。

FTP_TLS.auth()?

通過使用 TLS 或 SSL 來設(shè)置一個安全控制連接,具體取決于 ssl_version 屬性是如何設(shè)置的。

在 3.4 版更改: 此方法現(xiàn)在支持使用 ssl.SSLContext.check_hostname服務(wù)器名稱指示 (參見 ssl.HAS_SNI) 進(jìn)行主機(jī)名檢查。

FTP_TLS.ccc()?

將控制通道回復(fù)為純文本。 這適用于發(fā)揮知道如何使用非安全 FTP 處理 NAT 而無需打開固定端口的防火墻的優(yōu)勢。

3.3 新版功能.

FTP_TLS.prot_p()?

設(shè)置加密數(shù)據(jù)連接。

FTP_TLS.prot_c()?

設(shè)置明文數(shù)據(jù)連接。