Most pythonic way to convert a string to a octal number

Question:

I am looking to change permissions on a file with the file mask stored in a configuration file. Since os.chmod() requires an octal number, I need to convert a string to an octal number. For example:

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

After an obvious first attempt of creating every octal number from 0000 to 0777 and putting it in a dictionary lining it up with the string version, I came up with the following:

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)

Is there a simpler way to do this?

Asked By: brandonsimpkins

||

Answers:

Have you just tried specifying base 8 to int:

num = int(your_str, 8)

Example:

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

For Python 3.x do

. . .
print(i == 0o644)
Answered By: Jon Clements

Here is the soluation:

Turn octal string “777” to decimal number 511

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

you worry about the os.chmod()? Let’s try!

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!

it proves that the chmod can accept decimal and decimal can used as octal in python !


it is enough for the octal, because if you try

print dec_num == 0777 # True

Then get the decimal number 511 translate to octal string “0777”

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

Pay attention there is no number 0777 but only oct string “0777” or dec num
in the python if you write number 0777, it auto translate 0777 to 511, in the process there is no 0777 number exist.

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!
Answered By: Felix
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.