0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

paramikoでSFTP通信をするときの、ディレクトリとファイルの見分け方

Posted at

目的

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の知識ではぱっと例を出すことは出来なかった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?