6.4 stat -- stat() の返す内容を解釈する

stat モジュールでは、os.stat()os.lstat() および os.fstat() (存在すれば) の返す 内容を解釈するための定数や関数を定義しています。stat()fstat()、および lstat() の関数呼び出しについての 完全な記述はシステムのドキュメントを参照してください。

stat モジュールでは、特殊なファイル型を判別するための以下の 関数を定義しています:

S_ISDIR( mode)
ファイルのモードがディレクトリの場合にゼロでない値を返します。

S_ISCHR( mode)
ファイルのモードがキャラクタ型の特殊デバイスファイルの場合にゼロでない値を返します。

S_ISBLK( mode)
ファイルのモードがブロック型の特殊デバイスファイルの場合にゼロでない値を返します。

S_ISREG( mode)
ファイルのモードが通常ファイルの場合にゼロでない値を返します。

S_ISFIFO( mode)
ファイルのモードが FIFO (名前つきパイプ) の場合にゼロでない値を返します。

S_ISLNK( mode)
ファイルのモードがシンボリックリンクの場合にゼロでない値を返します。

S_ISSOCK( mode)
ファイルのモードがソケットの場合にゼロでない値を返します。

より一般的なファイルのモードを操作するための二つの関数が定義されています:

S_IMODE( mode)
os.chmod() で設定することのできる一部のファイルモード -- すなわち、ファイルの許可ビット (permission bits) に加え、 (サポートされているシステムでは) スティッキービット (sticky bit)、 実行グループ ID 設定 (set-group-id) および 実行ユーザ ID 設定 (set-user-id) ビット -- を返します。

S_IFMT( mode)
ファイルの形式を記述しているファイルモードの一部 (上記の S_IS*() 関数で使われます) を返します。

通常、ファイルの形式を調べる場合には os.path.is*() 関数 を使うことになります; ここで挙げた関数は同じファイルに対して 複数のテストを同時に行いたいが、stat() システムコール を何度も呼び出してオーバヘッドが生じるのを避けたい場合に便利です。 これらはまた、ブロック型およびキャラクタ型デバイスに対するテスト のように、os.path で扱うことのできないファイルの 情報を調べる際にも便利です。

以下の全ての変数は、os.stat()os.fstat()、または os.lstat() が返す 10 要素のタプルにおけるインデクスを単に シンボル定数化したものです。

ST_MODE
I ノードの保護モード。

ST_INO
I ノード番号。

ST_DEV
I ノードが存在するデバイス。

ST_NLINK
該当する I ノードへのリンク数。

ST_UID
ファイルの所持者のユーザ ID。

ST_GID
ファイルの所持者のグループ ID。

ST_SIZE
通常ファイルではバイトサイズ; いくつかの特殊ファイルでは処理待ちの データ量。

ST_ATIME
最後にアクセスした時刻。

ST_MTIME
最後に変更された時刻。

ST_CTIME
オペレーティングシステムから返される``ctime''。あるOS(Unixなど)では最 後にメタデータが更新された時間となり、別のOS(Windowsなど)では作成時間と なります(詳細については各プラットフォームのドキュメントを参照してください)。

``ファイルサイズ'' の解釈はファイルの型によって異なります。 通常のファイルの場合、サイズはファイルの大きさをバイトで表した ものです。ほとんどの Unix 系 (特に Linux) における FIFO やソケット の場合、``サイズ'' は os.stat()os.fstat()、 あるいは os.lstat() を呼び出した時点で読み出し待ちであった データのバイト数になります; この値は時に有用で、特に上記の特殊なファイル を非ブロックモードで開いた後にポーリングを行いたいといった場合に 便利です。他のキャラクタ型およびブロック型デバイスにおけるサイズ フィーるの意味はさらに異なっていて、背後のシステムコールの実装に よります。

例を以下に示します:

import os, sys
from stat import *

def walktree(top, callback):
    '''recursively descend the directory tree rooted at top,
       calling the callback function for each regular file'''

    for f in os.listdir(top):
        pathname = os.path.join(top, f)
        mode = os.stat(pathname)[ST_MODE]
        if S_ISDIR(mode):
            # It's a directory, recurse into it
            walktree(pathname, callback)
        elif S_ISREG(mode):
            # It's a file, call the callback function
            callback(pathname)
        else:
            # Unknown file type, print a message
            print 'Skipping %s' % pathname

def visitfile(file):
    print 'visiting', file

if __name__ == '__main__':
    walktree(sys.argv[1], visitfile)
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。