Python Загрузить последнюю версию CSV с FTP-сервера [дубликат]

import datetime
hours = datetime.timedelta(hours=16, minutes=30)
print((datetime.datetime(1,1,1) + hours).strftime('%H:%M'))
5
задан Martin Prikryl 27 June 2018 в 06:38
поделиться

4 ответа

Если у вас есть все даты в 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()
1
ответ дан istruble 15 August 2018 в 20:40
поделиться
  • 1
    я создал другой список, см. обновление, кажется, что проблема с сортировкой словаря. – krisdigitx 25 January 2012 в 00:37
  • 2
    Я знаю, что вы отвечаете на вопрос OP. Но в целом, если OP ищет только один последний файл, это переполнение и потеря памяти для создания списка (-ов) дат в первую очередь. Просто найдите последний файл уже в самом первом цикле. Кроме того, существуют и другие более эффективные решения. См. мой ответ . – Martin Prikryl 27 June 2018 в 06:44

Я не знаю, как это ваш 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()
1
ответ дан Arthur Accioly 15 August 2018 в 20:40
поделиться

Для тех, кто ищет полное решение для поиска последнего файла в папке:

Если ваш 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 .

1
ответ дан Martin Prikryl 15 August 2018 в 20:40
поделиться

Почему вы не используете следующую опцию dir?

ftp.dir('-t',data.append)

С помощью этой опции список файлов упорядочен по времени от самого нового до самого старого. Затем просто загрузите первый файл в список, чтобы загрузить его.

6
ответ дан Santi Oliveras 15 August 2018 в 20:40
поделиться
  • 1
    Ничего не стоит, что переключатель -t является запатентованным (и фактически нарушает спецификацию FTP). Хотя он довольно широко поддерживается, он не универсален. См. мой ответ для ссылки на детали. – Martin Prikryl 27 June 2018 в 06:33
Другие вопросы по тегам:

Похожие вопросы: