import datetime
hours = datetime.timedelta(hours=16, minutes=30)
print((datetime.datetime(1,1,1) + hours).strftime('%H:%M'))
Если у вас есть все даты в time.struct_time
( strptime
даст вам это) в списке, то все, что вам нужно сделать, это sort
list.
Вот пример:
#!/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()
Я не знаю, как это ваш ftp, но ваш пример не работал на меня. Я изменил некоторые строки, связанные с частью сортировки даты:
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()
Для тех, кто ищет полное решение для поиска последнего файла в папке:
Если ваш FTP-сервер поддерживает команду MLSD
, решение легко:
entries = list(ftp.mlsd())
entries.sort(key = lambda entry: entry[1]['modify'], reverse = True)
latest_name = entries[0][0]
print(latest_name)
Если вам нужно полагаться на устаревшую команду LIST
, вы должны проанализировать ее листинг, который он возвращает.
Общий список * nix выглядит следующим образом:
-rw-r--r-- 1 user group 4467 Mar 27 2018 file1.zip
-rw-r--r-- 1 user group 124529 Jun 18 15:31 file2.zip
С таким списком этот код будет делать:
from dateutil import parser
# ...
lines = []
ftp.dir("", lines.append)
latest_time = None
latest_name = None
for line in lines:
tokens = line.split(maxsplit = 9)
time_str = tokens[5] + " " + tokens[6] + " " + tokens[7]
time = parser.parse(time_str)
if (latest_time is None) or (time > latest_time):
latest_name = tokens[8]
latest_time = time
print(latest_name)
Это довольно хрупкий подход.
Более надежный, но менее эффективный способ - это используйте команду MDTM
для получения временных меток отдельных файлов / папок:
names = ftp.nlst()
latest_time = None
latest_name = None
for name in names:
time = ftp.sendcmd("MDTM " + name)
if (latest_time is None) or (time > latest_time):
latest_name = name
latest_time = time
print(latest_name)
Некоторые FTP-серверы поддерживают собственный нестандартный переключатель -t
для NLST
(или LIST
) команда.
lines = ftp.nlst("-t")
latest_name = lines[-1]
См. Как получить файлы в папке FTP, отсортированные по времени модификации .
Независимо от того, какой подход вы используете, latest_name
, вы загружаете его как любой другой файл:
file = open(latest_name, 'wb')
ftp.retrbinary('RETR '+ latest_name, file.write)
См. также Получите последнее имя папки FTP в Python .
Почему вы не используете следующую опцию dir?
ftp.dir('-t',data.append)
С помощью этой опции список файлов упорядочен по времени от самого нового до самого старого. Затем просто загрузите первый файл в список, чтобы загрузить его.
-t
является запатентованным (и фактически нарушает спецификацию FTP). Хотя он довольно широко поддерживается, он не универсален. См. мой ответ для ссылки на детали.
– Martin Prikryl
27 June 2018 в 06:33