2015-12-10 66 views
1

我第一次使用Python FTP lib。我的目標是簡單地連接到FTP站點,獲取目錄列表,然後下載比特定日期更新的所有文件(例如下載在過去5天內創建或修改的所有文件)Python FTP:可解析的目錄列表

由於一些原因,結果比我預期的要複雜一些。首先,我發現沒有真正的「標準」FTP文件列表格式。大多數FTP站點通常使用UNIX ls格式,但這不能保證。

因此,我最初的想法是簡單地解析UNIX ls格式:畢竟它並沒有那麼糟糕,似乎大多數主流FTP服務器都會使用它來響應LIST命令。

這是很容易與Python的FTPLIB的代碼:

import ftplib 

def callback(line): 
    print(line) 

ftp = ftplib.FTP("ftp.example.com") 
result = ftp.login(user = "myusername", passwd = "XXXXXXXX") 
dirlist = ftp.retrlines("LIST", callback) 

這工作,但問題是,在由我負責的FTP服務器返回的UNIX列表格式給出的日期不有一年。一個典型的條目是:

-rw-rw-r-- 1 user user 1505581 Dec 9 21:53 somefile.txt 

所以這裏的問題是,我不得不在額外的邏輯進行編碼排序的「猜測」如果日期是指本年度或沒有。除了真的,我寧願不編寫一些像這樣的複雜邏輯,看起來很沒必要 - 沒有理由FTP服務器應該不能給我一年。

好吧,谷歌搜索周圍一些替代方式來獲得LIST信息後,我發現,許多FTP服務器支持MLSTMLSD命令,在「機器可讀」的格式,這顯然提供了一個目錄列表,即一個更適合自動處理的列表格式。大。所以,我嘗試以下方法:

dirlist = ftp.sendcmd("MLST") 
print(dirlist) 

這將產生一個單行響應,給了我關於當前工作目錄中的數據,而不是文件的列表。

250-Start of list for/
modify=20151210094445;perm=flcdmpe;type=cdir;unique=808U6EC0051;UNIX.group=1003;UNIX.mode=0775;UNIX.owner=1229;/
250 End of list 

所以這看起來很不錯,而且很容易解析,而且它也有一個修改日期與年份。除了看起來MLST命令顯示有關目錄本身的信息,而不是文件列表。

因此,我搜索並閱讀relevant RFCs,但似乎無法弄清楚如何獲得「MLST」格式的文件列表。看來MLSD命令是我想要的,但我得到一個425錯誤,當我嘗試:

File "temp8.py", line 8, in <module> 
    dirlist = ftp.sendcmd("MLSD") 
    File "/usr/lib/python3.2/ftplib.py", line 255, in sendcmd 
    return self.getresp() 
    File "/usr/lib/python3.2/ftplib.py", line 227, in getresp 
    raise error_temp(resp) 
ftplib.error_temp: 425 Unable to build data connection: Invalid argument 


所以,我怎樣才能在這裏MLST/MLSD格式的完整目錄列表?

+0

您最好使用MDTM命令獲取單個文件的修改時間,而不是解析目錄列表。 –

回答

0

還有另一個模塊ftputil它是基於ftplib構建的,並且具有很多模擬os,os.path,shutil的特性。我發現它很容易在相關操作中使用和強大。也許你可以試試看。

至於你的目的,介紹碼完全解決它。