Ответ 1
Вы только что попробовали указать базу 8 на int
:
num = int(your_str, 8)
Пример:
s = '644'
i = int(s, 8) # 420 decimal
print i == 0644 # True
Я хочу изменить права доступа к файлу с файловой маской, хранящейся в файле конфигурации. Поскольку 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)
Есть ли более простой способ сделать это?
Вы только что попробовали указать базу 8 на int
:
num = int(your_str, 8)
Пример:
s = '644'
i = int(s, 8) # 420 decimal
print i == 0644 # True
Вот уступ:
Повернуть восьмеричную строку "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!