TGTGInsighttelegram intelligenceLIVE / telegram public index
← Python Заметки

TGINSIGHT SIMILAR POSTS

Најди сличен содржај

Изворен канал @pythonotes · Post #280 · 16 авг.

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

Hashtags

Резултати

Пронајдени 1 слични објави

Глобално пребарување

sudo recast

@sudo_recast · Post #918 · 17.04.2025 г., 09:47

A useful command when you encounter conflicts while cherry-picking: tig HEAD $(git rev-parse CHERRY_PICK_HEAD 2>/dev/null) -- $(git diff --name-only --diff-filter=U | head -1) #tricks@sudo_recast

Hashtags