如何在Python中通过SFTP连接后列出目录中的所有文件夹和文件

2024-05-13 21:09:03 发布

您现在位置: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']

我想知道是否只有这些文件?

我上面使用的命令也可以查看文件夹吗?

查看所有文件夹和文件的命令是什么?


Tags: 文件代码文件夹paramikoftppasswordfilesxml
2条回答

^{}返回所有内容、文件和文件夹。

如果有文件夹,请使用^{}来区分它们与文件。它返回^{}的集合。

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来徒劳地重新检索所有数据。

另请参见How to fetch sizes of all SFTP files in a directory through Paramiko


强制性警告:不要使用AutoAddPolicy–这样做将失去对MITM attacks的保护。有关正确的解决方案,请参见Paramiko "Unknown Server"

一个快速的解决方案是检查ftp.listdir()中每个对象的lstat输出。

下面是如何列出所有目录的。

>>> 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'
... 

相关问题 更多 >