Как с помощью pysftp или Paramiko получить список каталогов с атрибутами?

Как сказано в заголовке, я пытаюсь получить список всех файлов и каталогов в каталоге, включая их атрибуты (я ищу хотя бы имя, размер, последнее изменение, и это файл или папка) . Я использую Python 3 в Windows.

Я пробовал listdir() и получаю список файлов без атрибутов. Я пробовал listdir_attr() и получил список атрибутов, но без имен файлов - и я не вижу ничего, что гарантировало бы, что эти два списка будут в одном порядке, поэтому, насколько мне известно, я не могу просто обработайте два списка вместе.

Даже если я получу большую строку, которая выглядит как обычный ls листинг FTP / Linux, ничего страшного, я смогу проанализировать это позже. Мне просто нужно все, что имеет каждый файл или папку и как минимум атрибуты, которые я ищу для каждого.

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

import pysftp

cnopts=pysftp.CnOpts()
# - I know this next line is insecure, it's just for this test program and
#    just to get a directory listing.
cnopts.hostkeys = None

print('Connecting...')
with pysftp.Connection('test.rebex.net', username='demo', password='password',
                    cnopts=cnopts) as SFTP:

    mydirlist = SFTP.??????
    #                ^^^^^^ What goes here?

print('Result:')
print(mydirlist)

person CyberTaco    schedule 21.11.2019    source источник


Ответы (2)


Pysftp Connection.listdir_attr (а также Paramiko _ 2_, который стоит за ним) возвращает все.

Если вы напрямую распечатаете список, который возвращает метод, он не распечатает имена из-за (неправильного?) Способа его _ 3_ метод.

Но если вы печатаете отдельные элементы, он печатает имена (как _4 _ имеет лучшую реализацию):

files = sftp.listdir_attr(".")
for f in files:
    print(f)

Чтобы извлечь имя файла элемента, прочтите SFTPAttributes.filename:

files = sftp.listdir_attr(".")
for f in files:
    t = datetime.datetime.fromtimestamp(f.st_mtime).strftime('%Y-%m-%dT%H:%M:%S')
    print("{}: {} {}".format(f.filename, f.st_size, t))

Btw, listdir и listdir_attr возвращают точно такие же элементы в том же порядке, что и Paramiko _ 10_ вызывает только внутренние вызовы SFTPClient.listdir_attr:

return [f.filename for f in self.listdir_attr(path)]
person Martin Prikryl    schedule 21.11.2019
comment
Это ИДЕАЛЬНО - работает, объясняется просто и красиво сформулировано. Это абсолютно идеально, спасибо вам большое! :-) - person CyberTaco; 21.11.2019

Связанный: для тех, кто столкнется с этим в будущем, если вы хотите, чтобы список директорий в стиле Linux был в строке, начните с образца кода вверху и замените

    mydirlist = SFTP.??????
    #                ^^^^^^ What goes here?

вместо этого:

    mydirlist=""
    for i in SFTP.listdir_attr():
        mydirlist = mydirlist + str(i) + "\n"
    mydirlist = mydirlist.rstrip()
    print(mydirlist)

Это потребовало от меня некоторых размышлений, и я подумал, что поделюсь, если кому-то это понадобится в будущем.

person CyberTaco    schedule 21.11.2019
comment
Интересно! Я попробую! - person CyberTaco; 23.11.2019
comment
Красиво работает, спасибо! Обновлен код, чтобы отразить ваше предложение. :-) - person CyberTaco; 23.11.2019