2009-02-25 84 views
5

Python具有運行FTP通信的標準庫模塊ftplib。它有兩種獲取目錄內容列表的方法。一個,FTP.nlst(),將返回給定目錄名稱作爲參數的目錄內容列表。 (如果給定文件名,它將返回文件的名稱。)這是列出目錄內容的可靠方法,但不會指示列表中的每個項目是文件還是目錄。另一種方法是FTP.dir(),它給出了作爲參數給定的目錄的目錄內容(或給定文件名的文件屬性)的字符串格式化列表。通過FTP確定列表是否爲Python中的目錄或文件

根據a previous question on Stack Overflow,解析dir()的結果可能很脆弱(不同的服務器可能會返回不同的字符串)。不過,我正在尋找一些方法來通過FTP列出其他目錄中包含的目錄。據我所知,在字符串的權限部分中搜索d是我提出的唯一解決方案,但我想我不能保證權限將顯示在不同服務器之間的相同位置。是否有更強大的解決方案來通過FTP識別目錄?

回答

10

不幸的是,FTP沒有命令列出文件夾,因此解析從ftp.dir()獲得的結果將是「最好的」。

一個簡單的應用程序假設從LS標準的結果(而不是Windows FTP)

from ftplib import FTP 

ftp = FTP(host, user, passwd) 
for r in ftp.dir(): 
    if r.upper().startswith('D'): 
     print r[58:] # Starting point 

Standard FTP Commands

Custom FTP Commands

1

如果FTP服務器支持MLSD命令,然後請that答案對於幾個有用的類(FTPDirectoryFTPTree)。

0

另一種方法是假定一切都是一個目錄,並嘗試改變它。如果這成功了,它就是一個目錄,但是如果這會拋出一個ftplib.error_perm它可能是一個文件。你可以捕捉然後捕捉異常。當然,這並不是最安全的,但是也不能解釋領先'd'的瘋狂字符串。

def processRecursive(ftp,directory): 
    ftp.cwd(directory) 
    #put whatever you want to do in each directory here 
    #when you have called processRecursive with a file, 
    #the command above will fail and you will return 


    #get the files and directories contained in the current directory 
    filenames = [] 
    ftp.retrlines('NLST',filenames.append) 
    for name in filenames: 
     try: 
      processRecursive(ftp,name) 
     except ftplib.error_perm: 
      #put whatever you want to do with files here 

    #put whatever you want to do after processing the files 
    #and sub-directories of a directory here 
相關問題