在paramiko中区分文件或目录

psw*_*han 4 python attributes file mode paramiko

我试图遍历目录的内容并确定每个项目是文件还是文件夹。我可以执行此链接中建议的解决方案:

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

这有效,是的。作为旁注,我只是采用第一个字符而不是.split(), so str(ftp.lstati(i))[0] != 'd',因为这在我公认的非科学测试中似乎更快。

但这似乎非常hacky,所以我尝试查看其他方法。在几个文件夹的 SFTP 属性中,我看到:

<SFTPAttributes: [ size=4096 uid=1002 gid=1002 mode=040755 atime=1358785383 mtime=1359475285 ]>
Run Code Online (Sandbox Code Playgroud)

而对于文件,我看到:

<SFTPAttributes: [ size=72 uid=1002 gid=1002 mode=0100644 atime=1367598914 mtime=1367598914 ]>
Run Code Online (Sandbox Code Playgroud)

因此,该模式似乎010[permissions]适用于文件和040[permissions]目录(与我见过的少数目录一致,但不能说它是通用的)。这似乎是获取项目属性的更好方法!但是,当我使用 时ftp.stat(i).st_mode,我得到了不同的值——16877对于上述目录和33188上述文件。

这些是什么意思?有没有办法可以将该整数转换为文件模式?(我试过谷歌,但找不到任何相关的东西。)或者,有没有什么好的方法可以在不依赖str(lstat(i))返回“d”或不返回“d”的函数的情况下确定这一点?

sbe*_*rry 5

看起来高位确实告诉你它是文件还是目录:

S_ISDIR
S_ISREG

>>> oct(16877)
'040755'
>>> oct(33188)
'0100644'
Run Code Online (Sandbox Code Playgroud)

同样:

>>> int('040755', 8)
16877
>>> int('0100644', 8)
33188
Run Code Online (Sandbox Code Playgroud)


dav*_*ave 5

ParamikoSFTPAttributes.st_mode可以传递给 Pythonos.stat进行分析:

for file in ftp_cli.listdir_attr(path):
    is_dir = stat.S_ISDIR(file.st_mode)
    is_link = stat.S_ISLNK(file.st_mode)
    is_file = stat.S_ISREG(file.st_mode)
Run Code Online (Sandbox Code Playgroud)

  • 同一事物的另一个变体:`import stat``is_dir = stat.S_ISDIR(ftp.stat(remotepath).st_mode)` (2认同)