Получи случайную криптовалюту за регистрацию!

Как получить значение прав доступа к файлу в виде привычного ф | Python Заметки

Как получить значение прав доступа к файлу в виде привычного формата записи 755 или 644?
В целом, способ вот такой:

>>> path = '...'
>>> print(oct(os.stat(path).st_mode & 0o777).split('o')[-1])
'755'

Теперь разберёмся что всё это значит.

До того как мы сделали split() строка была следующего вида: 0o755
Что это за тип данных? Это тип int в восмиричной системе исчисления. Для преобразования в такой формат есть builtin функция oct()

>>> oct(493)
'0o755'

Как видите, результат возвращается виде строки. Но это не мешает нам создавать переменные синтаксисом восьмеричных чисел, то есть с префиксом 0o. Хотя, при распечатке мы всё равно получим int.

>>> x = 0o777
>>> print(x)
511

Преобразовать эту строку в int можно функцией int(), указав базис 8

>>> int('0o755', 8)
493

Теперь посмотрим что нам возвращает os.stat

>>> perm = os.stat(path).st_mode
33261

Преобразуем в oct

>>> oct(perm)
'0o100755'

Уже почти то что надо. Чтобы оставить только нужное, отрезаем лишнее с помощью оператора & (AND).
Для этого последние 3 значения ставим максимальными, остальные нулевыми.

>>> perm & 0o777
493


Оператор работает с бинарным представлением чисел, то есть операция была вот такая:

0b100000111101101
& 0b111111111
= 0b111101101

Вспоминаем побитовые операторы

Остаётся преобразовать в восьмеричное представление и убрать префикс

>>> oct(493)
'0o755'

>>> oct(493).split('o')[-1]
'755'

Именно в таком виде пермишены файла в коде обычно не используются.
Хранить и использовать их удобно в виде восьмеричного int

os.chmod(path, 0o755)

или строки

os.chmod(path, int('0o755', 8))

А зачем в строке если достаточно в int? Наприрмер чтобы в json была удобочитаемая запись. Так как сериализатор запишет восьмеричное число как обычный десятичный int

>>> json.dumps(0o755)
'493'

Поэтому для удобства пишем его строкой а потом преобразуем в восьмеричный int.

#tricks