Загрузка самого последнего файла с FTP с помощью 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     

try-continue важно, поскольку первые две строки пути, такие как '.' и ".." приведет к ошибке ValuError.

3 ответа

Решение

Как только у вас есть список имен файлов, вы можете просто отсортировать по имени файла, так как соглашение об именах S01375T-ГГГГ-ММ-ДД-чч-мм.csv это естественно отсортировать по дате / времени. Обратите внимание, что если S01375T- меняется часть вы можете отсортировать по имени разделить в фиксированной позиции или на первом -,

Если бы это было не так, вы могли бы использовать datetime.datetime.strptime метод для анализа имен файлов в datetime экземпляров.

Конечно, если вы хотите действительно упростить вещи, вы можете использовать PyFS-систему PyFileSystem, и это различные способы, позволяющие вам обращаться с системой FTP, как если бы она была медленной локальной файловой системой.

Вам нужно правильно извлечь метку времени из имени файла. Вы можете разделить имя файла по первому "-" и удалить расширение файла ".csv" (f.split('-', 1)[1][:-4]).
Тогда вам просто нужно построить объект datetime для сортировки.

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']

Btw. до тех пор, пока ваш формат времени "год-месяц-день-час-мин-сек", простая сортировка строк будет делать это:

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']

Попробуйте с -t опция в ftp.dir, это упорядочивает по дате в обратном порядке, затем занимает первое место в списке:

data = []
ftp.dir('-t',data.append)
filename = data[0]
Другие вопросы по тегам