9

如果你os.stat(path)在一个文件上运行然后获取它的st_mode参数,你如何从那里得到一个像这样的字符串:rw-r--r--正如 Unix 世界所知?

4

3 回答 3

14

从 Python 3.3 开始,您可以使用stat.filemode

In [7]: import os, stat

In [8]: print(stat.filemode(os.stat('/home/soon/foo').st_mode))
-rw-r--r--

In [9]: ls -l ~/foo
-rw-r--r-- 1 soon users 0 Jul 23 18:15 /home/soon/foo
于 2013-07-23T12:22:12.180 回答
5

像这样的东西:

import stat, os
def permissions_to_unix_name(st):
    is_dir = 'd' if stat.S_ISDIR(st.st_mode) else '-'
    dic = {'7':'rwx', '6' :'rw-', '5' : 'r-x', '4':'r--', '0': '---'}
    perm = str(oct(st.st_mode)[-3:])
    return is_dir + ''.join(dic.get(x,x) for x in perm)
... 

>>> permissions_to_unix_name(os.stat('.'))
'drwxr-xr-x'
>>> ls -ld .
drwxr-xr-x 62 monty monty 4096 Jul 23 13:23 ./

>>> permissions_to_unix_name(os.stat('so.py'))
'-rw-rw-r--'
>>> ls -ld so.py
-rw-rw-r-- 1 monty monty 68 Jul 18 15:57 so.py
于 2013-07-23T12:10:45.547 回答
2

下面的函数将实现这一点,给定一些通常的情况(即我没有在 Windows 或 SELinux 下测试过)。

import stat
def permissions_to_unix_name(st_mode):
    permstr = ''
    usertypes = ['USR', 'GRP', 'OTH']
    for usertype in usertypes:
        perm_types = ['R', 'W', 'X']
        for permtype in perm_types:
            perm = getattr(stat, 'S_I%s%s' % (permtype, usertype))
            if st_mode & perm:
                permstr += permtype.lower()
            else:
                permstr += '-'
    return permstr

这会按照要求生成一个基本字符串。但是,这也可以改进以显示更多数据,例如它是目录 ( d) 还是符号链接 ( l)。随意改进它。

于 2013-07-23T11:49:33.463 回答