Как получить значение прав доступа к файлу в виде привычного ф | 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