2011-12-05 10 views
2

私はこのようなファイルをダウンロードする方法を知っていますが、ほとんどのファイルはfile-LATESTという名前ではありません。最新のファイルをどのようにダウンロードできますか?Python ftplib、ftp経由で最新のファイルを入手

経由:

  • 日付変更
  • タイムスタンプ
  • if version.current < version.new then downloadここ

私がこれまで持っているものだ:

#!/usr/bin/env python 

import ftplib 
import os 
import socket 

HOST = 'ftp.site.org' 
DIRN = 'dir/' 
FILE = 'filename-LATEST.tar.gz' 

def main(): 
    try: 
    f = ftplib.FTP(HOST) 
except (socket.error, socket.gaierror), e: 
    print 'ERROR: cannot reach "%s"' % HOST 
    return 
print '*** Connected to host "%s"' % HOST 

try: 
    f.login() 
except ftplib.error_perm: 
    print 'ERROR:: cannot login anonymously' 
    f.quit() 
    return 
print '*** Logged in as "anonymous"' 

try: 
    f.cwd(DIRN) 
except ftplib.error_perm: 
    print 'ERROR: cannot CD to "%s"' % DIRN 
    f.quit() 
    return 
print '*** Changed to "%s" folder' % DIRN 

try: 
    f.retrbinary('RETR %s' % FILE, open(FILE, 'wb').write) 
except ftplib.error_perm: 
    print 'ERROR: cannot read file "%s"' % FILE 
    os.unlink(FILE) 
else: 
    print '*** Downloaded "%s" to CWD' % FILE 
f.quit() 
return 

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

[python ftpの最新のファイルを日付で取得](https://stackoverflow.com/questions/8990598/python-ftp-get-the-most-recent-file-by-date) –

答えて

0

あなたはのようにftp.retrlines('LIST',callback)をしなければなりません行うftplibのcと結果を解析する

+4

何をパースする? –

0

私の答えはftplibに関連していません。そのpexpect方法。別のftpサーバごとに異なります

#!/usr/bin/python -B 

#Program to download latest file from a FTP directory specified 

import sys 
import os 
import pexpect 

if len(sys.argv)!=5: 
    print "Usage:" 
    print "\t",sys.argv[0],"<IP Address> <Username> <Password> <Directory-Path>" 
    print "\t","Use \"\" if there is no password" 
    sys.exit(1) 

ip=str(sys.argv[1]) 
usr=str(sys.argv[2]) 
pswd=str(sys.argv[3]) 
path=str(sys.argv[4]) 
timeout=10 
log_file=file("temp",'w') 

try: 
    try: 
     child=pexpect.spawn("ftp "+ip) 
    except: 
     print "failed to connect "+sys.exc_function() 
     sys.exit(1) 

    x=child.expect(['Name',pexpect.EOF,pexpect.TIMEOUT],timeout) 
    if x!=0: 
     print "No \"Name\" prompt" 
     sys.exit(1) 

    child.sendline(usr) 
    x=child.expect(["[pP]assword","[lL]ogin [sS]ucess","logged in", 
      pexpect.EOF,pexpect.TIMEOUT],timeout) 
    if x==0: 
     child.sendline(pswd) #Add case for no password 
     y=child.expect(["[lL]ogin [sS]uccess","User "+usr+" logged in", 
     "[iI]correct [lLogin]",pexpect.EOF,pexpect.TIMEOUT],timeout) 
     if y!=0 and y!=1: 
      print "Login Failed" 
      sys.exit(1) 
    elif x!=1 and x!=2: 
     print "Authentication Timed Out!!" 
     sys.exit(1) 

    child.sendline("cd "+path) 
    x=child.expect(["[dD]irectory successfully changed","CWD command successful", 
      pexpect.EOF,pexpect.TIMEOUT],timeout) 
    if x!=0 and x!=1: 
     print "cd Failed!!!" 
     sys.exit(1) 

    child.logfile=log_file 

    child.sendline("ls -lrt") 
    x=child.expect(["[dD]irectory send OK","[tT]ransfer [cC]omplete", 
      pexpect.EOF,pexpect.TIMEOUT],timeout) 
    if x!=0 and x!=1: 
     print "listing failed" 
     sys.exit(1) 

    os.system("cat temp | grep '^-' |"+\ 
     "sed -n '$p' | awk '{print $NF}' > file_name") 

    fd=open("file_name","r") #for loop is not needed here since there'll be only one line 
    for line in fd: 
     if line: 
      latest_file=line.strip() 
      break 
     else: 
      print "No file found" 
      sys.exit(1) 
    fd.close() 
    child.logfile=sys.stdout 
    os.system("rm temp file_name") 

    child.sendline("bi") 
    child.expect("ftp>") 
    child.sendline("ha") 
    child.expect("ftp>") 

    child.sendline("get "+latest_file) 
    x=child.expect(["[tT]ransfer [cC]omplete", 
      pexpect.EOF,pexpect.TIMEOUT],200) #Add more error cases here 
    if x!=0: 
     print "Copy Failed" 
     sys.exit(1) 

    child.close() 
    sys.exit(0) 
except KeyboardInterrupt: 
    print "", 

ftpプロンプト以下のコードを参照してください。手作業で一度だけ試してみてください。expectはコード内で同じです。さらにエラーケースを追加することもできます。 log_fileを使用しました。私はls -lrtの出力をftp内でパイプして直接ファイル名を抽出することはできません。

私のコードは効率的ではありません。必要な場合は編集してください。しかし、これは動作します!歓声

関連する問題