繁体   English   中英

使用Python从FTP下载最新文件

[英]Downloading the most recent file from FTP with Python

我一直在尝试用Python编写一个函数,该函数将允许下载最新添加的文件(按文件名中的时间戳记)。

在此处输入图片说明

您可以看到该格式具有很大的时间戳。

到目前为止,在论坛的帮助下,我得到的是以下代码。 在以下代码中,我尝试使用日期字段(向FTP服务器实际添加的日期)进行排序。 但是,我想调整此代码,以便可以按文件名中的时间戳对文件进行排序。

编辑 (试图清理一下代码):

def DownloadFileFromFTPServer2 (server, username, password, directory_to_file, file_to_write):
    try:
        f = ftplib.FTP(server)
    except ((socket.error, socket.gaierror), e):
        print ('cannot reach to %s' % server)
        return
    print ("Connected to FTP server")

    try:
        f.login(username, password)
    except ftplib.error_perm:
        print ("cannot login anonymously")
        f.quit()
        return
    print ("Logged on to the FTP server")
    try:
        f.cwd(directory_to_file)
        print ("Directory has been set")
    except Exception as inst:
        print (inst)

    data = []
    f.dir(data.append)
    datelist = []
    filelist =[]

    for line in data:
        print (line)
        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 )

    # Sort by dates and get the latest file by date....
    for key in sorted(iter(who.keys()), reverse = True):  
        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)
            print ("Retrieving FTP server data ......... DONE")

        #VERY IMPORTANT RETURN
        return


    f.quit()

    return 1

非常感谢任何帮助。 谢谢。

编辑[已解决]:

线

        date = time.strptime (datestr, '%b %d %H:%M')

应替换为:

        try:
            date = datetime.datetime.strptime (str(col[8]), 'S01375T-%Y-%m-%d-%H-%M-%S.csv')
        except Exception as inst:
            continue     

尝试继续很重要,因为前两个路径行如“。”。 和“ ..”将导致ValuError。

一旦有了文件名列表,您就可以简单地对文件名进行排序,因为命名约定为S01375T- YYYY - MM - DD - hh - mm .csv因此自然可以按日期/时间顺序进行排序。 请注意,如果S01375T-部分有所不同,则可以按固定位置或第一个-的名称对名称进行排序。

如果不是这种情况,则可以使用datetime.datetime.strptime方法将文件名解析为datetime实例。

当然,如果您希望真正简化事情,可以使用PyFileSystem FTPFS ,它有多种方法可以让您将FTP系统视为慢速本地文件系统。

尝试使用ftp.dir中的-t选项,此选项按日期相反的顺序排列,然后取列表中的第一个:

data = []
ftp.dir('-t',data.append)
filename = data[0]

您需要从文件名中正确提取时间戳。 您可以在第一个'-'处分割文件名,并删除文件扩展名'.csv'( f.split('-', 1)[1][:-4] )。
然后,您只需要构造datetime obj进行排序即可。

from datetime import datetime

def sortByTimeStampInFile(fList):
    fileDict = {datetime.strptime(f.split('-', 1)[1][:-4], '%Y-%m-%d-%H-%M-%S'): f for f in fList if f.endswith('.csv')}
    return [fileDict[k] for k in sorted(fileDict.keys())]


files = ['S01375T-2016-03-01-12-00-00.csv', 'S01375T-2016-01-01-13-00-00.csv', 'S01375T-2016-04-01-13-01-00.csv']
print(sortByTimeStampInFile(files))

返回值:

['S01375T-2016-01-01-13-00-00.csv', 'S01375T-2016-03-01-12-00-00.csv', 'S01375T-2016-04-01-13-01-00.csv']

顺便说一句。 只要您的时间格式是“ year-month-day-day-hour-min-sec”,一个简单的字符串排序就可以做到:

sorted([f.split('-', 1)[1][:-4] for f in fList if f.endswith('.csv')])
>>> ['2016-01-01-13-00-00', '2016-03-01-12-00-00', '2016-04-01-13-01-00']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM