stat モジュールでは、 os.stat() 、 os.lstat() および os.fstat() (存在すれば) の返す内容を解釈するための定数や関数を定義しています。 stat() 、 fstat() 、および lstat() の関数呼び出しについての完全な記述はシステムのドキュメントを参照してください。
stat モジュールでは、特殊なファイル型を判別するための以下の関数を定義しています:
ファイルのモードがディレクトリの場合にゼロでない値を返します。
ファイルのモードがキャラクタ型の特殊デバイスファイルの場合にゼロでない値を返します。
ファイルのモードがブロック型の特殊デバイスファイルの場合にゼロでない値を返します。
ファイルのモードが通常ファイルの場合にゼロでない値を返します。
ファイルのモードが FIFO (名前つきパイプ) の場合にゼロでない値を返します。
ファイルのモードがシンボリックリンクの場合にゼロでない値を返します。
ファイルのモードがソケットの場合にゼロでない値を返します。
より一般的なファイルのモードを操作するための二つの関数が定義されています:
os.chmod() で設定することのできる一部のファイルモード — すなわち、ファイルの許可ビット (permission bits) に加え、 (サポートされているシステムでは) スティッキービット (sticky bit)、実行グループ ID 設定 (set-group-id) および 実行ユーザ ID 設定 (set-user-id) ビット — を返します。
ファイルの形式を記述しているファイルモードの一部 (上記の S_IS*() 関数で使われます) を返します。
通常、ファイルの形式を調べる場合には os.path.is*() 関数を使うことになります; ここで挙げた関数は同じファイルに対して 複数のテストを同時に行いたいが、 stat() システムコールを何度も呼び出してオーバヘッドが生じるのを避けたい場合に便利です。 これらはまた、ブロック型およびキャラクタ型デバイスに対するテストのように、 os.path で扱うことのできないファイルの 情報を調べる際にも便利です。
以下の全ての変数は、 os.stat() 、 os.fstat() 、または os.lstat() が返す 10 要素のタプルにおけるインデクスを単にシンボル定数化したものです。
Iノードの保護モード。
Iノード番号。
Iノードが存在するデバイス。
該当する Iノードへのリンク数。
ファイルの所持者のユーザ ID。
ファイルの所持者のグループ ID。
通常ファイルではバイトサイズ; いくつかの特殊ファイルでは処理待ちのデータ量。
最後にアクセスした時刻。
最後に変更された時刻。
オペレーティングシステムから返される”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)