【问题标题】:Most pythonic way to convert a string to a octal number将字符串转换为八进制数的最pythonic方法
【发布时间】:2013-09-19 08:22:25
【问题描述】:

我希望使用存储在配置文件中的文件掩码更改文件的权限。由于 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)

有没有更简单的方法来做到这一点?

【问题讨论】:

  • 不要将八进制文字符号与整数 混淆; 0o644 仍然是十进制的 420。 0x1a4 也是如此,即使它使用十六进制表示法。 Python 仍然为任何一个存储 420,只是您对解释器的拼写不同。一旦读取,Python 不会将其存储为八进制或十六进制。
  • 八进制表示法只是使读取值变得更容易,然后数字与权限整齐排列。 420 不容易告诉读者世界、组和用户权限是什么。 os.chmod 不需要 八进制数。它需要一个整数,但将它写成八进制只会让 人类 更容易读回它。
  • 我确实明白以 8 为基数表示法中的 0o644 与以 10 为基数表示法中的 420 是相同的数字。对于您的第二条评论,可读性是问题的重点。但是,我没有充分考虑 os.chmod() 的用法,我没有意识到 os.chmod() 方法不需要八进制格式的整数。感谢您指出这一点。

标签: python python-2.6


【解决方案1】:

您是否尝试过将基数 8 指定为 int

num = int(your_str, 8)

例子:

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

【讨论】:

  • 我无法在 python3 @Jon Clements♦ 中打印 print(i == 0644)
  • @alper 确实...因为:十进制整数文字中的前导零是不允许的;对八进制整数使用 0o 前缀 - 所以它应该是 print(i == 0o644)
  • 读者注意——这实际上不会将字符串转换为八进制。 int(s, 8) 将八进制字符串转换为其等效的十进制形式。
【解决方案2】:

解决办法如下:

将八进制字符串“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 decimaldecimal 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 而只有 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!

【讨论】:

  • 在 Python 3 中,您必须使用 0o777 而不是 0777。不过,0o777 在 Python 2 中也可以使用。
猜你喜欢
  • 2021-09-07
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多