2017-09-07 1 views
3

stat.py hat a helper function von der st_mode (ganze Zahl) gehen, wie von os.stat in das vertraute "Stringy" -Format gemeldet (ich weiß nicht, ob diese Darstellung einen Eigennamen hat).Wie komme ich von '-rw-r - r--' zurück zu 33188?

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

Gibt es eine Hilfsfunktion, um in die andere Richtung zu gehen?

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

Dies ist, was ich versucht habe, aber es produziert falsche Ergebnisse. Das ist die Behandlung nicht das erste Zeichen korrekt Dateityp angibt, und nicht die Handhabung Haftbits etc

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

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

Woher bekommen Sie die Zeichenfolge und können Sie stattdessen ein alternatives Format bereitstellen? – chepner

Antwort

2

Python ist Open-Source, können Sie nur den Quellcode für das stat Modul gelesen und die inverse Funktion schreiben.

See: 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 

Bitte beachte, dass ich "ungezogen" und den Zugriff auf private Mitglieder des stat Modul bin zu sein. Die üblichen Vorbehalte gelten.

Beachten Sie auch, dass die Dokumentation für stat.filemode falsch ist ohnehin, da 0o100000 technisch nicht Teil des Dateimodus ist, ist es der Dateityp S_IFREG. Von inode(7):

POSIX bezieht sich auf die stat.st_mode Bits der Maske S_IFMT (siehe unten) als Dateityp entspricht, wobei die 12 Bits an die Maske 07777 als Dateimodus-Bits und die am wenigsten signifikanten 9 Bits entspricht, (0777) als Dateiberechtigungsbits.

+0

Auf meiner Plattform ist die Python-Implementierung von filemode von der [* import] (https://github.com/python/cpython/blob/1f06a680de465be0c24a78ea3b610053955daa99/Lib/stat.py#L176) einer C-Implementierung und Das Verhalten jeder Implementierung unterscheidet sich etwas. Go figure .. – wim

+0

@wim: Das erklärt, warum es richtig funktioniert, da der Python-Code nicht funktioniert. –

Verwandte Themen