Как проверить удаленный путь - это файл или каталог?
Я использую SFTPClient
для загрузки файлов с удаленного сервера. Но я не знаю, является ли удаленный путь файлом или каталогом. Если удаленный путь - это каталог, мне нужно рекурсивно обрабатывать этот каталог.
это мой код:
def downLoadFile(sftp, remotePath, localPath):
for file in sftp.listdir(remotePath):
if os.path.isfile(os.path.join(remotePath, file)): # file, just get
try:
sftp.get(file, os.path.join(localPath, file))
except:
pass
elif os.path.isdir(os.path.join(remotePath, file)): # dir, need to handle recursive
os.mkdir(os.path.join(localPath, file))
downLoadFile(sftp, os.path.join(remotePath, file), os.path.join(localPath, file))
if __name__ == '__main__':
paramiko.util.log_to_file('demo_sftp.log')
t = paramiko.Transport((hostname, port))
t.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(t)
Я нахожу проблему: функция os.path.isfile
или os.path.isdir
возвращает False
, поэтому я думаю, что эти функции не могут работать для remotePath.
Ответы
Ответ 1
os.path.isfile()
и os.path.isdir()
работают только с именами локальных.
Вместо этого я бы использовал функцию sftp.listdir_attr()
и загрузил полные объекты SFTPAttributes
и проверил их атрибут st_mode
с помощью функций утилиты модуля stat
:
import stat
def downLoadFile(sftp, remotePath, localPath):
for fileattr in sftp.listdir_attr(remotePath):
if stat.S_ISDIR(fileattr.st_mode):
sftp.get(fileattr.filename, os.path.join(localPath, fileattr.filename))
Ответ 2
использовать модуль stat
import stat
for file in sftp.listdir(remotePath):
if stat.S_ISREG(sftp.stat(os.path.join(remotePath, file)).st_mode):
try:
sftp.get(file, os.path.join(localPath, file))
except:
pass
Ответ 3
Ниже приведены шаги, которые необходимо выполнить, чтобы проверить, является ли удаленный путь ФАЙЛОМ или СПИСКОМ:
1) Создайте соединение с удаленным
transport = paramiko.Transport((hostname,port))
transport.connect(username = user, password = pass)
sftp = paramiko.SFTPClient.from_transport(transport)
2) Предположим, что у вас есть каталог "/root/testing/", и вы хотите проверить код ur.Import stat
import stat
3) Используйте следующую логику, чтобы проверить, является ли ее файл или каталог
fileattr = sftp.lstat('root/testing')
if stat.S_ISDIR(fileattr.st_mode):
print 'is Directory'
if stat.S_ISREG(fileattr.st_mode):
print 'is File'