Как вывести список всех папок и файлов в каталоге после подключения через SFTP в Python

Я использую Python и пытаюсь подключиться к SFTP и хочу получить оттуда файл XML, и мне нужно поместить его в мою локальную систему. Ниже приведен код:

import paramiko

sftpURL   =  'sftp.somewebsite.com'
sftpUser  =  'user_name'
sftpPass  =  'password'

ssh = paramiko.SSHClient()
# automatically add keys without requiring human intervention
ssh.set_missing_host_key_policy( paramiko.AutoAddPolicy() )

ssh.connect(sftpURL, username=sftpUser, password=sftpPass)

ftp = ssh.open_sftp()
files = ftp.listdir()
print files

Здесь соединение успешно. Теперь я хочу просмотреть все папки и все файлы, и мне нужно войти в нужную папку для получения оттуда XML файла.

Наконец, я намерен просмотреть все папки и файлы после подключения к SFTP-серверу.

В приведенном выше коде я использовал ftp.listdir(), через который я получил вывод, как показано ниже

['.bash_logout', '.bash_profile', '.bashrc', '.mozilla', 'testfile_248.xml']

Я хочу знать, присутствуют ли эти файлы?

И команда, которую я использовал выше, тоже подходит для просмотра папок?

Что такое команда для просмотра всех папок и файлов?

Ответ 1

Одним из быстрых решений является просмотр вывода lstat каждого объекта в ftp.listdir().

Вот как вы можете перечислить все каталоги.

>>> for i in ftp.listdir():
...     lstatout=str(ftp.lstat(i)).split()[0]
...     if 'd' in lstatout: print i, 'is a directory'
... 

Файлы противоположного поиска:

>>> for i in ftp.listdir():
...     lstatout=str(ftp.lstat(i)).split()[0]
...     if 'd' not in lstatout: print i, 'is a file'
... 

Ответ 2

SFTPClient.listdir возвращает все, файлы и папки.

Были ли папки, чтобы отличить их от файлов, вместо этого используйте SFTPClient.listdir_attr. Возвращает коллекцию SFTPAttributes.

from stat import S_ISDIR, S_ISREG
for entry in sftp.listdir_attr(remotedir):
    mode = entry.st_mode
    if S_ISDIR(mode):
        print(entry.filename + " is folder")
    elif S_ISREG(mode):
        print(entry.filename + " is file")

Принятый ответ @Oz123 неэффективен. SFTPClient.listdir внутренне вызывает SFTPClient.listdir_attr и выбрасывает большую часть информации, возвращая только имена файлов и папок. Затем ответ бесполезно и кропотливо восстанавливает все эти данные, вызывая SFTPClient.lstat для каждого файла.

См. также Как получить размеры всех файлов SFTP в каталоге через Paramiko.


Обязательное предупреждение: не используйте AutoAddPolicy - тем самым вы теряете защиту от MITM-атак. Для правильного решения см. Paramiko & lt; Неизвестный сервер ".