代码之家  ›  专栏  ›  技术社区  ›  brandonsimpkins

将字符串转换为八进制数的最Python方法

  •  18
  • brandonsimpkins  · 技术社区  · 11 年前

    我想更改一个文件的权限,该文件的文件掩码存储在配置文件中。由于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 回复  |  直到 11 年前
        1
  •  44
  •   Brōtsyorfuzthrāx    2 年前

    你刚试过把基数8指定为 int :

    num = int(your_str, 8)
    

    例子:

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

    对于Python 3.x do

    . . .
    print(i == 0o644)
    
        2
  •  2
  •   Felix    8 年前

    以下是解决方案:

    将八进制字符串“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 在蟒蛇!


    对于八进制来说已经足够了,因为如果你尝试

    print dec_num == 0777 # True
    

    然后将小数511转换为八进制 string "0777"

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

    注意没有数字0777,只有oct字符串“0777”或dec num 在python中,如果你写数字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!