目的
paramikoでSFTP通信を行う時、あるディレクトリの中にあるオブジェクトの一覧は見えるが、それがファイルかフォルダかの判別はできない。
体系的なディレクトリの中に統計データがある場合、再帰的にファイルの一覧を取得したいが、listdirだけではディレクトリの情報は取得できないことがあった。
これに対応するためにはparamikoだけではなく、pythonの標準のstatパッケージを使って対応する必要があるようだ。
手順
目的で示された問題を解決するためには、あるディレクトリの中に格納されているオブジェクトの一覧に対して、それぞれがファイルかフォルダかそれ以外かを判別する必要があった。
APIの説明では「SFTPClient.listdirはos.listdirと同じようなもの」であり、実際に中身のファイルの一覧を文字列のリストで返してくるが、問題は直接「os.path.isdir」の代わりになる関数が無いことと、関数を実行するたびにsftpで通信を行うことによって通信コストが増大することにある。
※APIの説明はこっち。
この問題を回避するには、listdir_attrを使って中身を調査するのが良さそうだ。
コード
ざっくりとコードを書くと、ある特定のフォルダからディレクトリだけ抜き出す場合はこのような感じになる。
import stat
import paramiko
def get_dir_list(sftp_client, path):
item_attr_list = sftp_client.listdir_attr(path)
dir_list = []
for item in item_attr_list:
if item.st_mode & stat.S_IFREG:
dir_list.append(item.filename)
return dir_list
重要なのなstatパッケージのインポート、それとitem.st_modeの値の確認だ。
st_modeの値のビットの中にstat.S_IFDIRが含まれていたならディレクトリ、S_IFREGが含まれていたならファイルらしい。
他にも考えられる値があるようだが、自分のlinuxの知識ではぱっと例を出すことは出来なかった。