Most pythonic way to convert a string to a octal number

浪子不回头ぞ 提交于 2019-12-10 12:31:15

问题


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?


回答1:


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



回答2:


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!


来源:https://stackoverflow.com/questions/18806772/most-pythonic-way-to-convert-a-string-to-a-octal-number

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!