Загрузите последний файл в соответствии с отметкой времени в имени файла с SFTP-сервера. - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь получить последний новый файл в каталоге удаленного Linux сервера. Файл на SFTP-сервере создается каждые 4 часа, и имя файла c начинается с filegen_date_hour.json, как показано ниже. В этом случае последний файл 'filegen_20200101_0800. json' необходимо перенести в мой локальный каталог.

filegen_20200101_0000.json
filegen_20200101_0400.json
filegen_20200101_0800.json

Я использую код Python 3 ниже, но получил ошибку

latestFile = max(listFile, key=os.path.getctime)
ValueError: max() arg is an empty sequence

SFTP код ниже

myHostname = "192.168.100.10"
myUsername = "user"
myPassword = "password"

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

with pysftp.Connection(host=myHostname, username=myUsername, password=myPassword, cnopts=cnopts) as sftp:
    with sftp.cd('/home/operation/genfiles/'):             
        fileDir = '/home/operation/genfiles/filegen_*.json' 
        **#file have specific pattern with filegen_*.json**
        listFile = glob.glob(fileDir)
        latestFile = max(listFile, key=os.path.getctime)
        sftp.get(latestFile)         

Благодарим вас за помощь в этом вопросе. Спасибо за ваш ответ и помощь.

1 Ответ

1 голос
/ 22 апреля 2020

Во-первых, вы не можете использовать glob для вывода списка файлов на SFTP-сервере. glob волшебным образом не начнет запрашивать SFTP-сервер только потому, что вы уже открывали SFTP-соединение Он по-прежнему будет запрашивать локальную файловую систему.

Использовать pysftp Connection.listdir. Хотя он не поддерживает подстановочные знаки, вам придется фильтровать файлы, которые вы хотите локально. Как здесь:
Вывести список файлов на SFTP-сервере, соответствующих шаблону в Python, используя Paramiko


Только тогда вы можете попытаться найти последний файл. В общем, вы можете использовать время модификации файла, как здесь:
Как загрузить только последний файл с SFTP-сервера с помощью Paramiko?
Код предназначен для Paramiko SFTPClient.listdir_attr, но это то же самое с pysftp Connection.listdir_attr.

Но в вашем случае я не уверен, можете ли вы полагаться на метку времени модификации. Кажется, что вы действительно хотите использовать метку времени в имени файла. С вашим форматом имени файла вы можете просто выбрать последний файл лексикографически.

import fnmatch

...

with sftp.cd('/home/operation/genfiles'):             
    files = []
    for filename in sftp.listdir():
        if fnmatch.fnmatch(filename, "filegen_*.json"):
            files.append(filename)
    latestFile = max(files)

Обязательное предупреждение: не устанавливайте cnopts.hostkeys = None, если вы не заботитесь о безопасности. Для правильного решения см. Проверьте ключ хоста с помощью pysftp .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...