Большинство 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) 

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

2 Solutions collect form web for “Большинство pythonic способ преобразования строки в восьмеричное число”

Вы просто попытались указать базу 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.

резюме

 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! 
  • Ошибка связи SQLAlchemy: у объекта нет атрибута 'c'
  • Удаление полностью изолированных ячеек из массива Python?
  • точка из списка в дубликулярную переменную
  • Форматирование строк без индекса в python2.6
  • Получить класс, который определил метод
  • «Аутсорсинг» обработки исключений для декоратора
  • Setup.py: установить lxml с Python2.6 на CentOS
  • Как я могу получить ElementTree Python для печати в XML-файле?
  • Python - лучший язык программирования в мире.