Как вывести список всех папок и файлов в каталоге после подключения через 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; Неизвестный сервер ".