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 是空字串或
"-"
,則會自動生成一個密碼。timeout (float | None) -- 阻塞操作(如
connect()
)的超時時間,單位為秒(預設:全域性預設超時設定)。source_address (tuple | None) -- 一個二元組
(host, port)
,用作套接字在連線前繫結的源地址。encoding (str) -- 目錄和檔名的編碼(預設:
'utf-8'
)。
>>> 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
方法只能在成功建立連線後呼叫。- 引數:
觸發一個引數為
self
,host
,port
的 審計事件ftplib.connect
。在 3.3 版本發生變更: 添加了 source_address 引數。
- getwelcome()¶
返回伺服器在初始連線時傳送的歡迎訊息。(此訊息有時包含可能與使用者相關的免責宣告或幫助資訊。)
- login(user='anonymous', passwd='', acct='')¶
登入到已連線的 FTP 伺服器。每個例項在建立連線後只應呼叫此函式一次;如果在建立
FTP
例項時給出了 host 和 user 引數,則不應呼叫此函式。大多數 FTP 命令只有在客戶端登入後才被允許。
- abort()¶
中止正在進行的檔案傳輸。使用此方法並不總能成功,但值得一試。
- voidcmd(cmd)¶
向伺服器傳送一個簡單的命令字串並處理響應。如果響應碼錶示成功(範圍在 200-299 內),則返回響應字串。否則引發
error_reply
。觸發一個引數為
self
,cmd
的 審計事件ftplib.sendcmd
。
- retrbinary(cmd, callback, blocksize=8192, rest=None)¶
以二進位制傳輸模式檢索檔案。
- retrlines(cmd, callback=None)¶
使用在初始化時指定的 encoding 引數,以該編碼檢索檔案或目錄列表。cmd 應該是一個合適的
RETR
命令(參見retrbinary()
)或一個如LIST
或NLST
的命令(通常只是字串'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)¶
透過資料連線發起一次傳輸。如果傳輸是主動的,傳送一個
EPRT
或PORT
命令和由 cmd 指定的傳輸命令,並接受連線。如果伺服器是被動的,傳送一個EPSV
或PASV
命令,連線到它,並開始傳輸命令。無論哪種方式,都返回連線的套接字。如果給出了可選的 rest,會向伺服器傳送一個
REST
命令,並將 rest 作為引數傳遞。rest 通常是所請求檔案中的一個位元組偏移量,告訴伺服器從請求的偏移量處重新開始傳送檔案位元組,跳過初始位元組。但請注意,transfercmd()
方法會使用在初始化時指定的 encoding 引數將 rest 轉換為字串,但不會對字串內容進行檢查。如果伺服器不識別REST
命令,將引發error_reply
異常。如果發生這種情況,只需不帶 rest 引數呼叫transfercmd()
即可。
- ntransfercmd(cmd, rest=None)¶
與
transfercmd()
類似,但返回一個包含資料連線和預期資料大小的元組。如果無法計算預期大小,則預期大小將返回None
。cmd 和 rest 的含義與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
命令不是標準化的,但許多常見的伺服器實現都支援它。
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 是空字串或
"-"
,則會自動生成一個密碼。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 版更改: 已移除已棄用的 keyfile 和 certfile 引數。
以下是使用
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 連線問題(而不是呼叫者造成的程式設計錯誤)而引發的所有異常的集合(以元組形式)。該集合包括上面列出的四個異常以及OSError
和EOFError
。
參見
- 模組
netrc
.netrc
檔案格式的解析器。FTP 客戶端通常使用.netrc
檔案在提示使用者之前載入使用者認證資訊。