2012-01-24 84 views
4

獲得最新的文件,我使用FTPLIB連接到FTP站點。我想獲取最近上傳的文件並下載它。我能夠連接到FTP服務器並列出這些文件,我也將它們放在一個列表中並獲得了日期字段的轉換。有沒有可以獲取最近日期並從列表中輸出整行的功能/模塊?蟒蛇FTP按日期

#!/usr/bin/env python 

import ftplib 
import os 
import socket 
import sys 


HOST = 'test' 


def main(): 
    try: 
     f = ftplib.FTP(HOST) 
    except (socket.error, socket.gaierror), e: 
     print 'cannot reach to %s' % HOST 
     return 
    print "Connect to ftp server" 

    try: 
     f.login('anonymous','[email protected]') 
    except ftplib.error_perm: 
     print 'cannot login anonymously' 
     f.quit() 
     return 
    print "logged on to the ftp server" 


    data = [] 
    f.dir(data.append) 
    for line in data: 
     datestr = ' '.join(line.split()[0:2]) 
     orig-date = time.strptime(datestr, '%d-%m-%y %H:%M%p') 


    f.quit() 
    return 


if __name__ == '__main__': 
    main() 

UPDATE:

現在我試圖創建兩個列表,日期和其他的文件名,然後合併成一個字典,但整理之後,它似乎沒有不給出正確的價值觀..

什麼想法?

data = [] 
    f.dir(data.append) 
    datelist = [] 
    filelist = [] 
    for line in data: 
     col = line.split() 
     datestr = ' '.join(line.split()[0:2]) 
     date = time.strptime(datestr, '%m-%d-%y %H:%M%p') 
     datelist.append(date) 
     filelist.append(col[3]) 

    combo = zip(datelist,filelist) 
    who = dict(combo) 
    for key,value in sorted(who.iteritems(), key =lambda (k,v): (v,k)): 
     print "%s: %s" % (key,value) 

解決:

以前的錯誤是由於字典按值排序,我已經更新了它的鍵排序和現在的工作,

data = [] 
    f.dir(data.append) 
    datelist = [] 
    filelist = [] 
    for line in data: 
     col = line.split() 
     datestr = ' '.join(line.split()[0:2]) 
     date = time.strptime(datestr, '%m-%d-%y %H:%M%p') 
     datelist.append(date) 
     filelist.append(col[3]) 

    combo = zip(datelist,filelist) 
    who = dict(combo) 
# print who 
# for key,value in sorted(who.iteritems(), key =lambda (k,v): (v,k)): 

    for key in sorted(who.iterkeys(), reverse=True): 
     print "%s: %s" % (key,who[key]) 
     filename = who[key] 
     print "file to download is %s" % filename 
     try: 
      f.retrbinary('RETR %s' % filename, open(filename, 'wb').write) 
     except ftplib.err_perm: 
      print "Error: cannot read file %s" % filename 
      os.unlink(filename) 
     else: 
      print "***Downloaded*** %s " % filename 
     return 

    f.quit() 
    return 

的一個問題,就是有可能從字典中檢索第一個元素?我在這裏所做的是,for循環只運行一次,然後退出,從而給了我第一個排序值這是很好的,但我不認爲這是一個很好的做法去做這樣..

+0

是否有可能加入下載,而不是隻是一般的最新文件最新的.csv文件? – Deusdeorum

+0

FTP以明文形式發送密碼。 SFTP更安全(FTP over SSH,pip install [pysftp](https://pypi.python.org/pypi/pysftp)),但[速度不快](https://serverfault.com/a/559554/103459)作爲FTPS(FTP在SSL/TLS),如使用,其是作爲簡單['ftplib.FTP_TLS()'](https://docs.python.org/library/ftplib.html#ftplib.FTP_TLS)代替'FTPLIB .FTP()'。 –

回答

2

如果你擁有所有在time.struct_time日期(strptime會給你這個)列表中的那麼所有你需要做的就是sort列表。

下面是一個例子:

#!/usr/bin/python 

import time 

dates = [ 
    "Jan 16 18:35 2012", 
    "Aug 16 21:14 2012", 
    "Dec 05 22:27 2012", 
    "Jan 22 19:42 2012", 
    "Jan 24 00:49 2012", 
    "Dec 15 22:41 2012", 
    "Dec 13 01:41 2012", 
    "Dec 24 01:23 2012", 
    "Jan 21 00:35 2012", 
    "Jan 16 18:35 2012", 
] 

def main(): 
    datelist = [] 
    for date in dates: 
     date = time.strptime(date, '%b %d %H:%M %Y') 
     datelist.append(date) 

    print datelist 
    datelist.sort() 
    print datelist 

if __name__ == '__main__': 
    main() 
+0

我創建了另一個列表,看到更新,似乎排序詞典的一些問題.. – krisdigitx

1

我不知道它是如何你的FTP,但你的例子是不是爲我工作。我改變了與日期排序部分相關的一些行:

import sys 
    from ftplib import FTP 
    import os 
    import socket 
    import time 

    # Connects to the ftp 
    ftp = FTP(ftpHost) 
    ftp.login(yourUserName,yourPassword) 
    data = [] 
    datelist = [] 
    filelist = [] 
    ftp.dir(data.append) 
    for line in data: 
     col = line.split() 
     datestr = ' '.join(line.split()[5:8]) 
     date = time.strptime(datestr, '%b %d %H:%M') 
     datelist.append(date) 
     filelist.append(col[8]) 
    combo = zip(datelist,filelist) 
    who = dict(combo) 
    for key in sorted(who.iterkeys(), reverse=True): 
     print "%s: %s" % (key,who[key]) 
     filename = who[key] 
     print "file to download is %s" % filename 
     try: 
     ftp.retrbinary('RETR %s' % filename, open(filename, 'wb').write) 
     except ftplib.err_perm: 
     print "Error: cannot read file %s" % filename 
     os.unlink(filename) 
     else: 
     print "***Downloaded*** %s " % filename 
    ftp.quit() 
6

爲什麼不使用下一個dir選項?

ftp.dir('-t',data.append) 

使用此選項,文件列表的時間從最新到最舊排序。然後檢索列表中的第一個文件以下載它。