我正在使用ftplib连接到ftp站点。我想获取最新上传的文件并下载。我能够连接到ftp服务器并列出文件,我也将它们放在列表中并进行了datefield转换。是否有任何功能/模块可以获取最新日期并从列表中输出整行?
datefield
#!/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','al@ge.com') 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()
解决:
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 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循环仅运行一次并退出,从而为我提供了一个很好的第一个排序值,但是我认为以这种方式进行操作不是一个好习惯。
使用NLST,就像Martin Prikryl的回答一样:您应该使用sorted方法:
ftp = FTP(host="127.0.0.1", user="u",passwd="p") ftp.cwd("/data") file_name = sorted(ftp.nlst(), key=lambda x: ftp.voidcmd(f"MDTM {x}"))[-1]