【问题标题】:Distinguish between a file or a directory in paramiko在 paramiko 中区分文件或目录
【发布时间】:2013-05-01 00:18:51
【问题描述】:

我正在尝试遍历目录的内容并确定每个项目是文件还是文件夹。我可以做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”的情况下确定这一点?

【问题讨论】:

  • 模式是八进制的。你可以oct(integerValue)查看模式。

标签: python file attributes mode paramiko


【解决方案1】:

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

S_ISDIR
S_ISREG

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

同样:

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

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 同一事物的另一个变体:import statis_dir = stat.S_ISDIR(ftp.stat(remotepath).st_mode)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    相关资源
    最近更新 更多