ファイルのパーミッション(アクセス権限)を確認・変更するには os.stat() と os.chmod() を使う。
パーミッションを確認する
os.stat() でファイル情報を取得し、st_mode 属性でパーミッションを確認できる。
import os
import stat
mode = os.stat('script.py').st_mode
# 8進数で表示
print(oct(mode)) # 例: 0o100644
# 所有者が実行可能か確認
if mode & stat.S_IXUSR:
print('所有者は実行可能')
stat モジュールの定数を使うと、特定の権限をチェックできる。
import os
import stat
mode = os.stat('data.txt').st_mode
# 読み取り権限の確認
print('所有者読取:', bool(mode & stat.S_IRUSR))
print('グループ読取:', bool(mode & stat.S_IRGRP))
print('その他読取:', bool(mode & stat.S_IROTH))
# 書き込み権限の確認
print('所有者書込:', bool(mode & stat.S_IWUSR))
パーミッションを変更する
os.chmod() でパーミッションを変更できる。
import os
# 8進数で指定(644 = rw-r--r--)
os.chmod('data.txt', 0o644)
# 実行権限を付与(755 = rwxr-xr-x)
os.chmod('script.py', 0o755)
stat モジュールの定数を使う
stat モジュールの定数を組み合わせると、意図が明確になる。
import os
import stat
# 所有者に読み書き、グループとその他に読み取りのみ
os.chmod('data.txt', stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH)
主な定数は以下の通りだ。
| 定数 | 意味 | 8進数 |
|---|---|---|
| S_IRUSR | 所有者読取 | 0o400 |
| S_IWUSR | 所有者書込 | 0o200 |
| S_IXUSR | 所有者実行 | 0o100 |
| S_IRGRP | グループ読取 | 0o040 |
| S_IWGRP | グループ書込 | 0o020 |
| S_IXGRP | グループ実行 | 0o010 |
| S_IROTH | その他読取 | 0o004 |
| S_IWOTH | その他書込 | 0o002 |
| S_IXOTH | その他実行 | 0o001 |
pathlib を使う方法
pathlib でも chmod() メソッドでパーミッションを変更できる。
from pathlib import Path
path = Path('script.py')
path.chmod(0o755)
アクセス可能かどうかを確認する
os.access() を使うと、現在のユーザーがファイルにアクセスできるかを確認できる。
import os
# 読み取り可能か
print(os.access('data.txt', os.R_OK))
# 書き込み可能か
print(os.access('data.txt', os.W_OK))
# 実行可能か
print(os.access('script.py', os.X_OK))