Я пытаюсь пройти содержимое каталога и определить, является ли каждый элемент файлом или папкой. Я могу сделать решение, предложенное в this link:Различать файл или каталог в paramiko
>>> 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'
, поскольку это, по-видимому, быстрее в моем, по общему признанию, ненаучном тестировании.
Но это кажется чрезвычайно взломанным, поэтому я попытался проверить другие методы. В 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
для вышеупомянутого файла.
Что это значит? Есть ли способ, которым я могу преобразовать это целое число в режим файла? (Я пробовал Google, но не могу найти что-либо релевантное.) Альтернативно, есть ли какой-либо хороший способ, я могу определить это, не полагаясь на функцию str(lstat(i))
, возвращающую 'd' или нет-бы?
Режимы являются восьмеричными. Вы можете сделать 'oct (integerValue)' для просмотра режима. – sberry