区分paramiko中的文件或目录

时间:2013-05-07 06:15:40

标签: python file attributes mode paramiko

我正在尝试遍历目录的内容,并确定每个项目是文件还是文件夹。我可以执行this link中建议的解决方案:

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

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

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

<SFTPAttributes: [ size=4096 uid=1002 gid=1002 mode=040755 atime=1358785383 mtime=1359475285 ]>

虽然文件相同,但我看到:

<SFTPAttributes: [ size=72 uid=1002 gid=1002 mode=0100644 atime=1367598914 mtime=1367598914 ]>

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

这些是什么意思?有没有办法可以将整数转换为文件模式? (我试过谷歌,但找不到任何相关内容。)另外,有没有什么好方法可以判断这个而不依赖str(lstat(i))函数返回'd'或不-d'?

2 个答案:

答案 0 :(得分:4)

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

S_ISDIR
S_ISREG

>>> oct(16877)
'040755'
>>> oct(33188)
'0100644'

同样地:

>>> int('040755', 8)
16877
>>> int('0100644', 8)
33188

答案 1 :(得分:2)

Paramiko的SFTPAttributes.st_mode可以传递给Python os.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)