2017-09-07 73 views
3

stat.py已將a helper functionos.stat報告中的st_mode(整數)轉換爲熟悉的「stringy」格式(我不知道該表示是否具有正確的名稱)。如何從'-rw-r - r--'回到33188?

>>> stat.filemode(0o100644) 
'-rw-r--r--' 

有幫助功能去其他方式嗎?

>>> filemode_inv('-rw-r--r--') 
33188 

這是我試過的,但它產生了錯誤的結果。那不是治療的第一個字符表示正確的文件類型,而不是處理粘位等

table = {ord('r'): '1', ord('w'): '1', ord('-'): '0'} 

def filemode_inv(s): 
    return int(s.translate(table), 2) 
+0

你從那裏得到的字符串是什麼,這件事可以爲你提供替代的格式嗎? – chepner

回答

2

Python是開源的,你可以閱讀有關stat模塊的源代碼,寫的反函數。

參見:https://github.com/python/cpython/blob/master/Lib/stat.py#L112

import stat 

def un_filemode(mode_str): 
    mode = 0 
    for char, table in zip(mode_str, stat._filemode_table): 
     for bit, bitchar in table: 
      if char == bitchar: 
       mode |= bit 
       break 
    return mode 

請注意,我是 「淘氣」 和訪問stat模塊的私有成員。通常的注意事項適用。

另請注意,stat.filemode的文檔無論如何都是不正確的,因爲0o100000在技術上不是文件模式的一部分,它是文件類型S_IFREG。從inode(7)

POSIX是指對應於所述掩模的S_IFMT比特stat.st_mode(見下文)作爲文件類型,對應於掩模07777作爲文件模式位的12位和至少顯著9個比特(0777)作爲文件權限位。

+0

在我的平臺上,filemode的Python實現被C實現的[* import](https://github.com/python/cpython/blob/1f06a680de465be0c24a78ea3b610053955daa99/Lib/stat.py#L176)吹走,每個實現的行爲有所不同。去圖.. – wim

+0

@wim:這解釋了爲什麼它能正常工作,因爲Python代碼沒有。 –