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?
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)
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!
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?
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)
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!