Python でファイルのパーミッションを確認・変更する

ファイルのパーミッション(アクセス権限)を確認・変更するには 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))