Подтвердить что ты не робот

Большинство pythonic способ преобразования строки в восьмеричное число

Я хочу изменить права доступа к файлу с файловой маской, хранящейся в файле конфигурации. Поскольку os.chmod() требует восьмеричное число, мне нужно преобразовать строку в восьмеричное число. Например:

'000' ==> 0000 (or 0o000 for you python 3 folks)
'644' ==> 0644 (or 0o644)
'777' ==> 0777 (or 0o777)   

После очевидной первой попытки создать каждое восьмеричное число с 0000 по 0777 и поместить его в словарь, выстроив его в строку с строковой версией, я придумал следующее:

def new_oct(octal_string):

    if re.match('^[0-7]+$', octal_string) is None:
        raise SyntaxError(octal_string)

    power = 0
    base_ten_sum = 0

    for digit_string in octal_string[::-1]:
        base_ten_digit_value = int(digit_string) * (8 ** power)
        base_ten_sum += base_ten_digit_value
        power += 1

    return oct(base_ten_sum)

Есть ли более простой способ сделать это?

4b9b3361

Ответ 1

Вы только что попробовали указать базу 8 на int:

num = int(your_str, 8)

Пример:

s = '644'
i = int(s, 8) # 420 decimal
print i == 0644 # True

Ответ 2

Вот уступ:

Повернуть восьмеричную строку "777" в десятичное число 511

dec_num = int(oct_string, 8) # "777" -> 511

Вы беспокоитесь о os.chmod()? Попробуйте!

os.chmod("file", 511)  # it works! -rwxrwxrwx.
os.chmod("file", 0777) # it works! -rwxrwxrwx.
os.chmod("file", int("2777",8)) # it works! -rwxrwsrwx. the number is 1535!

это доказывает, что chmod can accept decimal и decimal can used as octal в python!


этого достаточно для восьмеричного, потому что если вы попробуете

print dec_num == 0777 # True

Затем введите десятичное число 511 в восьмеричный string "0777"

oct_num = oct(dec_num)  # 511 -> "0777" , it is string again.

Обратите внимание, что нет номера 0777, но только октавная строка "0777" или dec num в питоне, если вы пишете номер 0777, он автоматически переводит 0777 на 511, при этом не существует номера 0777.

summary

dec_num = int(oct_string, 8)
oct_num = oct(int(oct_string,8))

print dec_num         # 511
print dec_num == 0777 # True ! It is actually 511, just like dec_num == 511
print oct_num         # 0777
print oct_num == 0777 # Flase! Because it is a string!