我第一次使用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服務器支持MLST
和MLSD
命令,在「機器可讀」的格式,這顯然提供了一個目錄列表,即一個更適合自動處理的列表格式。大。所以,我嘗試以下方法:
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
格式的完整目錄列表?
您最好使用MDTM命令獲取單個文件的修改時間,而不是解析目錄列表。 –