ftplib --- FTP 協議客戶端

原始碼: Lib/ftplib.py


此模組定義了 FTP 類和一些相關的條目。FTP 類實現了 FTP 協議的客戶端。你可以用它來編寫 Python 程式,執行各種自動化的 FTP 任務,比如映象其他 FTP 伺服器。它也被 urllib.request 模組用於處理使用 FTP 的 URL。有關 FTP(檔案傳輸協議)的更多資訊,請參閱網際網路 RFC 959

遵循 RFC 2640,預設編碼為 UTF-8。

可用性:非 WASI。

此模組在 WebAssembly 上不起作用或不可用。有關更多資訊,請參閱 WebAssembly 平臺

以下是使用 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.'

參考

FTP 物件

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

返回一個 FTP 類的新例項。

引數:
  • host (str) -- 要連線的主機名。如果給出,建構函式會隱式呼叫 connect(host)

  • user (str) -- 用於登入的使用者名稱(預設為 'anonymous')。如果給出,建構函式會隱式呼叫 login(host, passwd, acct)

  • passwd (str) -- 登入時使用的密碼。如果未給出,且 passwd 是空字串或 "-",則會自動生成一個密碼。

  • acct (str) -- 用於 ACCT FTP 命令的賬戶資訊。很少有系統實現這個功能。詳見 RFC-959

  • timeout (float | None) -- 阻塞操作(如 connect())的超時時間,單位為秒(預設:全域性預設超時設定)。

  • source_address (tuple | None) -- 一個二元組 (host, port),用作套接字在連線前繫結的源地址。

  • encoding (str) -- 目錄和檔名的編碼(預設:'utf-8')。

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 引數。

在 3.9 版本發生變更: 如果 timeout 引數被設為零,它將引發 ValueError 以防止建立非阻塞套接字。添加了 encoding 引數,並且預設值從 Latin-1 更改為 UTF-8 以遵循 RFC 2640

有幾個 FTP 方法提供了兩種版本:一種用於處理文字檔案,另一種用於處理二進位制檔案。這些方法以所使用的命令命名,後跟 lines 表示文字版本,或 binary 表示二進位制版本。

FTP 例項有以下方法:

set_debuglevel(level)

將例項的除錯級別設定為一個 int。這控制了列印的除錯輸出量。除錯級別為:

  • 0 (預設):無除錯輸出。

  • 1:產生適量的除錯輸出,通常每個請求一行。

  • 2 或更高:產生最大量的除錯輸出,記錄在控制連線上傳送和接收的每一行。

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

連線到給定的主機和埠。每個例項只應呼叫此函式一次;如果在建立 FTP 例項時給出了 host 引數,則不應呼叫此函式。所有其他 FTP 方法只能在成功建立連線後呼叫。

引數:
  • host (str) -- 要連線的主機。

  • port (int) -- 要連線的 TCP 埠(預設:21,由 FTP 協議規範指定)。很少需要指定不同的埠號。

  • timeout (float | None) -- 連線嘗試的超時時間,單位為秒(預設:全域性預設超時設定)。

  • source_address (tuple | None) -- 一個二元組 (host, port),用作套接字在連線前繫結的源地址。

觸發一個引數為 self, host, port審計事件 ftplib.connect

在 3.3 版本發生變更: 添加了 source_address 引數。

getwelcome()

返回伺服器在初始連線時傳送的歡迎訊息。(此訊息有時包含可能與使用者相關的免責宣告或幫助資訊。)

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

登入到已連線的 FTP 伺服器。每個例項在建立連線後只應呼叫此函式一次;如果在建立 FTP 例項時給出了 hostuser 引數,則不應呼叫此函式。大多數 FTP 命令只有在客戶端登入後才被允許。

引數:
  • user (str) -- 用於登入的使用者名稱(預設為 'anonymous')。

  • passwd (str) -- 登入時使用的密碼。如果未給出,且 passwd 是空字串或 "-",則會自動生成一個密碼。

  • acct (str) -- 用於 ACCT FTP 命令的賬戶資訊。很少有系統實現這個功能。詳見 RFC-959

abort()

中止正在進行的檔案傳輸。使用此方法並不總能成功,但值得一試。

sendcmd(cmd)

向伺服器傳送一個簡單的命令字串並返回響應字串。

觸發一個引數為 self, cmd審計事件 ftplib.sendcmd

voidcmd(cmd)

向伺服器傳送一個簡單的命令字串並處理響應。如果響應碼錶示成功(範圍在 200-299 內),則返回響應字串。否則引發 error_reply

觸發一個引數為 self, cmd審計事件 ftplib.sendcmd

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

以二進位制傳輸模式檢索檔案。

引數:
  • cmd (str) -- 一個合適的 RETR 命令:"RETR filename"

  • callback (callable) -- 一個接受單個引數的可呼叫物件,每接收一個數據塊時就會被呼叫,其唯一的引數是作為 bytes 的資料。

  • blocksize (int) -- 在為實際傳輸建立的底層 socket 物件上讀取的最大塊大小。這也對應於將傳遞給 callback 的最大資料大小。預設為 8192

  • rest (int) -- 一個要傳送到伺服器的 REST 命令。請參閱 transfercmd() 方法的 rest 引數文件。

retrlines(cmd, callback=None)

使用在初始化時指定的 encoding 引數,以該編碼檢索檔案或目錄列表。cmd 應該是一個合適的 RETR 命令(參見 retrbinary())或一個如 LISTNLST 的命令(通常只是字串 'LIST')。LIST 檢索檔案列表及其資訊。NLST 檢索檔名列表。對每一行呼叫 callback 函式,其引數為去除了末尾 CRLF 的字串。預設的 callback 將行列印到 sys.stdout

set_pasv(val)

如果 val 為真,啟用“被動”模式,否則停用被動模式。被動模式預設開啟。

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

以二進位制傳輸模式儲存檔案。

引數:
  • cmd (str) -- 一個合適的 STOR 命令:"STOR filename"

  • fp (file object) -- 一個檔案物件(以二進位制模式開啟),將一直讀取到 EOF,使用其 read() 方法以 blocksize 大小的塊提供要儲存的資料。

  • blocksize (int) -- 讀取塊的大小。預設為 8192

  • callback (callable) -- 一個接受單個引數的可呼叫物件,每傳送一個數據塊時就會被呼叫,其唯一的引數是作為 bytes 的資料。

  • rest (int) -- 一個要傳送到伺服器的 REST 命令。請參閱 transfercmd() 方法的 rest 引數文件。

在 3.2 版本發生變更: 添加了 rest 引數。

storlines(cmd, fp, callback=None)

以行模式儲存檔案。cmd 應該是一個合適的 STOR 命令(參見 storbinary())。使用 file object fp(以二進位制模式開啟)的 readline() 方法讀取行直到 EOF,以提供要儲存的資料。callback 是一個可選的單引數可呼叫物件,在每行傳送後被呼叫。

transfercmd(cmd, rest=None)

透過資料連線發起一次傳輸。如果傳輸是主動的,傳送一個 EPRTPORT 命令和由 cmd 指定的傳輸命令,並接受連線。如果伺服器是被動的,傳送一個 EPSVPASV 命令,連線到它,並開始傳輸命令。無論哪種方式,都返回連線的套接字。

如果給出了可選的 rest,會向伺服器傳送一個 REST 命令,並將 rest 作為引數傳遞。rest 通常是所請求檔案中的一個位元組偏移量,告訴伺服器從請求的偏移量處重新開始傳送檔案位元組,跳過初始位元組。但請注意,transfercmd() 方法會使用在初始化時指定的 encoding 引數將 rest 轉換為字串,但不會對字串內容進行檢查。如果伺服器不識別 REST 命令,將引發 error_reply 異常。如果發生這種情況,只需不帶 rest 引數呼叫 transfercmd() 即可。

ntransfercmd(cmd, rest=None)

transfercmd() 類似,但返回一個包含資料連線和預期資料大小的元組。如果無法計算預期大小,則預期大小將返回 Nonecmdrest 的含義與 transfercmd() 中相同。

mlsd(path='', facts=[])

使用 MLSD 命令 (RFC 3659) 以標準化格式列出目錄。如果省略 path,則假定為當前目錄。facts 是一個字串列表,表示所需資訊的型別(例如 ["type", "size", "perm"])。返回一個生成器物件,為在 path 中找到的每個檔案生成一個包含兩個元素的元組。第一個元素是檔名,第二個元素是一個包含有關檔名事實的字典。此字典的內容可能受 facts 引數限制,但伺服器不保證返回所有請求的事實。

在 3.3 版本加入。

nlst(argument[, ...])

返回由 NLST 命令返回的檔名列表。可選的 argument 是要列出的目錄(預設為當前伺服器目錄)。可以使用多個引數向 NLST 命令傳遞非標準選項。

備註

如果你的伺服器支援該命令,mlsd() 提供了更好的 API。

dir(argument[, ...])

生成由 LIST 命令返回的目錄列表,並將其列印到標準輸出。可選的 argument 是要列出的目錄(預設為當前伺服器目錄)。可以使用多個引數向 LIST 命令傳遞非標準選項。如果最後一個引數是一個函式,它將被用作像 retrlines() 一樣的 callback 函式;預設列印到 sys.stdout。此方法返回 None

備註

如果你的伺服器支援該命令,mlsd() 提供了更好的 API。

rename(fromname, toname)

將伺服器上的檔案 fromname 重新命名為 toname

delete(filename)

從伺服器上刪除名為 filename 的檔案。如果成功,返回響應的文字,否則在許可權錯誤時引發 error_perm,在其他錯誤時引發 error_reply

cwd(pathname)

設定伺服器上的當前目錄。

mkd(pathname)

在伺服器上建立一個新目錄。

pwd()

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

rmd(dirname)

刪除伺服器上名為 dirname 的目錄。

size(filename)

請求伺服器上名為 filename 的檔案的大小。成功時,檔案大小以整數形式返回,否則返回 None。請注意,SIZE 命令不是標準化的,但許多常見的伺服器實現都支援它。

quit()

向伺服器傳送一個 QUIT 命令並關閉連線。這是一種“禮貌”地關閉連線的方式,但如果伺服器對 QUIT 命令響應錯誤,可能會引發異常。這隱含地呼叫了 close() 方法,這將使 FTP 例項在後續呼叫中變得無用(見下文)。

close()

單方面關閉連線。這不應應用於已經關閉的連線,例如在成功呼叫 quit() 之後。此呼叫後,不應再使用 FTP 例項(在呼叫 close()quit() 後,你不能透過發出另一個 login() 方法來重新開啟連線)。

FTP_TLS 物件

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

一個 FTP 的子類,它按照 RFC 4217 的描述為 FTP 添加了 TLS 支援。連線到埠 21,在身份驗證前隱式地保護 FTP 控制連線。

備註

使用者必須透過呼叫 prot_p() 方法來顯式地保護資料連線。

引數:
  • host (str) -- 要連線的主機名。如果給出,建構函式會隱式呼叫 connect(host)

  • user (str) -- 用於登入的使用者名稱(預設為 'anonymous')。如果給出,建構函式會隱式呼叫 login(host, passwd, acct)

  • passwd (str) -- 登入時使用的密碼。如果未給出,且 passwd 是空字串或 "-",則會自動生成一個密碼。

  • acct (str) -- 用於 ACCT FTP 命令的賬戶資訊。很少有系統實現這個功能。詳見 RFC-959

  • context (ssl.SSLContext) -- 一個 SSL 上下文物件,允許將 SSL 配置選項、證書和私鑰捆綁到一個單一的、可能長期存在的結構中。請閱讀 安全考量 以瞭解最佳實踐。

  • timeout (float | None) -- 阻塞操作(如 connect())的超時時間,單位為秒(預設:全域性預設超時設定)。

  • source_address (tuple | None) -- 一個二元組 (host, port),用作套接字在連線前繫結的源地址。

  • encoding (str) -- 目錄和檔名的編碼(預設:'utf-8')。

在 3.2 版本加入。

在 3.3 版本發生變更: 添加了 source_address 引數。

在 3.4 版更改: 該類現在支援透過 ssl.SSLContext.check_hostname 進行主機名檢查和*伺服器名稱指示*(參見 ssl.HAS_SNI)。

在 3.9 版本發生變更: 如果 timeout 引數被設為零,它將引發 ValueError 以防止建立非阻塞套接字。添加了 encoding 引數,並且預設值從 Latin-1 更改為 UTF-8 以遵循 RFC 2640

在 3.12 版更改: 已移除已棄用的 keyfilecertfile 引數。

以下是使用 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']

FTP_TLS 類繼承自 FTP,並定義了這些額外的方法和屬性:

ssl_version

要使用的 SSL 版本(預設為 ssl.PROTOCOL_SSLv23)。

auth()

根據 ssl_version 屬性中的指定,使用 TLS 或 SSL 建立一個安全的控制連線。

在 3.4 版本發生變更: 該方法現在支援透過 ssl.SSLContext.check_hostname 和*伺服器名稱指示*(參見 ssl.HAS_SNI)進行主機名檢查。

ccc()

將控制通道恢復為明文。這對於利用那些知道如何處理非安全 FTP 的 NAT 防火牆而無需開啟固定埠很有用。

在 3.3 版本加入。

prot_p()

建立安全的資料連線。

prot_c()

建立明文資料連線。

模組變數

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 連線問題(而不是呼叫者造成的程式設計錯誤)而引發的所有異常的集合(以元組形式)。該集合包括上面列出的四個異常以及 OSErrorEOFError

參見

模組 netrc

.netrc 檔案格式的解析器。FTP 客戶端通常使用 .netrc 檔案在提示使用者之前載入使用者認證資訊。