2012-01-24 15 views
4

ftplibを使用してftpサイトに接続しています。最近アップロードされたファイルを入手してダウンロードしたいと思います。私はftpサーバに接続してファイルをリストすることができます。リストに入れてdatefieldを変換しました。最近の日付を取得してリストから全行を出力できる関数/モジュールはありますか?python 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ループが1回だけ実行され、それによって最初のソートされた値が得られますが、このようにするのは良い方法だとは思われません。

+0

最新のファイルの代わりに追加された最新の.csvファイルをダウンロードすることはできますか? – Deusdeorum

+0

FTPはパスワードを平文で送信します。 SFTPはより安全です(FTP over SSH、pip install [pysftp](https://pypi.python.org/pypi/pysftp))、[速くない](https://serverfault.com/a/559554/103459) 'ftplib(ftplib.FTP_TLS()'の代わりに['ftplib.FTP_TLS()'](https://docs.python.org/library/ftplib.html#ftplib.FTP_TLS)を使用するのと同じくらい簡単なFTPS(SSL over TLS) .FTP() '。 –

答えて

2

time.struct_timestrptime)の日付がリストに表示されます。すると、リストはsortとなります。それはあなたのftpのですが、あなたの例では、私のために働いていなかったか、私は知りません

#!/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

私は別のリストを作成しました、更新を見て、辞書を並べ替えることでtheres someproblemようです.. – krisdigitx

1

は、ここでの例です。

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

なぜ次のディレクトリオプションを使用しないのですか?

このオプションを使用すると、ファイルのリストは最新のものから古いものへと時間順に並べられます。その後、リストの最初のファイルをダウンロードしてダウンロードします。

関連する問題