Получение последних файлов из папки FTP (имя файла с пробелами) в Python

У меня есть требование, когда я должен вытащить последние файлы из папки FTP, проблема в том, что имя файла имеет пробелы, а имя файла имеет определенный шаблон. Ниже приведен код, который я реализовал:

import sys
from ftplib import FTP
import os
import socket
import time
import pandas as pd
import numpy as np
from glob import glob
import datetime as dt
from __future__ import with_statement

ftp = FTP('')
ftp.login('','')
ftp.cwd('')
ftp.retrlines('LIST')

filematch='*Elig.xlsx'
downloaded = []

for filename in ftp.nlst(filematch):
  fhandle=open(filename, 'wb')
  print 'Getting ' + filename
  ftp.retrbinary('RETR '+ filename, fhandle.write)
  fhandle.close()
  downloaded.append(filename)

ftp.quit()

Я понимаю, что могу добавить пустой список к ftp.команда dir (), но поскольку имя файла имеет пробелы, я не могу разделить его правильно и выбрать последний файл типа, который я придумал выше.

любая помощь будет быть здорово.

2 ответов


вы можете получить файл mtime, отправив MDTM команда iff FTP-сервер поддерживает его и сортирует файлы на FTP-сервере соответственно.

def get_newest_files(ftp, limit=None):
    """Retrieves newest files from the FTP connection.

    :ftp: The FTP connection to use.
    :limit: Abort after yielding this amount of files.
    """

    files = []

    # Decorate files with mtime.
    for filename in ftp.nlst():
        response = ftp.sendcmd('MDTM {}'.format(filename))
        _, mtime = response.split()
        files.append((mtime, filename))

    # Sort files by mtime and break after limit is reached.
    for index, decorated_filename in enumerate(sorted(files, reverse=True)):
        if limit is not None and index >= limit:
            break

        _, filename = decorated_filename  # Undecorate
        yield filename


downloaded = []

# Retrieves the newest file from the FTP server.
for filename in get_newest_files(ftp, limit=1):
    print 'Getting ' + filename

    with open(filename, 'wb') as file:
        ftp.retrbinary('RETR '+ filename, file.write)

    downloaded.append(filename)

проблема в том, что команда FTP "LIST" возвращает текст для людей, формат которого зависит от реализации FTP-сервера.

использование PyFilesystem (вместо стандартного ftplib) и его API предоставит API "list" (поиск "walk"), которые предоставляют Pythonic структуры списков файлов и каталогов, размещенных на FTP-сервере.

http://pyfilesystem2.readthedocs.io/en/latest/index.html