TGViewer
Python Заметки Python Заметки @pythonotes · 2.2K subscribers
Post #280 1.75K
Как получить значение прав доступа к файлу в виде привычного формата записи 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
Wikipedia Восьмеричная система счисления позиционная система записи чисел, используя 8 цифр
More from @pythonotes
  1. Sep 21, 2026­ WebAssembly это мощная технология позволяющая загружать практически любое приложение в б…
  2. Aug 17, 2026Не так давно столкнулся с API который в ответе с ошибкой присылал только статус-код. Без п…
  3. Jul 20, 2026У меня основная ОС это Linux. Но нередко требуется делать сборку клиента под Windows. Соби…
  4. Jul 13, 2026В прошлый раз был пример с понижением привелегий процесса. Проблема в том, что обратно под…
  5. Jul 6, 2026Модуль pwd может использоваться для считывания информации о пользователях из базы данных п…
  6. Jun 22, 2026Недавно я реализовал Multi Tenancy систему на FastAPI + SQLAlchemy и пересобрал её в небол…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →