os.stat()函数的用法

2019年6月20日 / 101次阅读 / Last Modified 2019年8月2日
os模块

os.stat() 函数会给出一个文件或文件描述符(file descriptor)的各种状态信息,如权限,大小,所属用户和组,修改时间等。这个函数实际上是调用OS的系统调用stat()来实现功能,对应Linux中stat命令。函数的返回是一个os.stat_result对象。

os.stat()函数

下面这段代码来自Python官方页面:

>>> import os
>>> statinfo = os.stat('somefile.txt')
>>> statinfo
os.stat_result(st_mode=33188, st_ino=7876932, st_dev=234881026,
st_nlink=1, st_uid=501, st_gid=501, st_size=264, st_atime=1297230295,
st_mtime=1297230027, st_ctime=1297230027)
>>> statinfo.st_size
264

os.stat()函数还可以接受symbolic link file作为入参。请看如下代码,c.txt是a.txt的一个软连接:

[xinlin@promote test2]$ ll
total 0
-rw-rw-r--. 1 xinlin xinlin 0 Jun 19 18:31 a.txt
-rw-rw-r--. 1 xinlin xinlin 0 Jun 19 18:31 b.txt
lrwxrwxrwx. 1 xinlin xinlin 5 Jun 19 18:32 c.txt -> a.txt
>>> os.stat('c.txt')
os.stat_result(st_mode=33204, st_ino=17693157, st_dev=64768, st_nlink=1, 
st_uid=1000, st_gid=1000, st_size=0, st_atime=1560940275,
 st_mtime=1560940275, st_ctime=1560940275)

os.stat()函数的官方链接:https://docs.python.org/3/library/os.html#os.stat

os.lstat()函数

如果想要查询symbolic link file本身的信息,可以使用一个非常相似的函数,os.lstat()。 注意函数名称多了一个l字符。

>>> os.lstat('c.txt')
os.stat_result(st_mode=41471, st_ino=17693175, st_dev=64768, st_nlink=1, 
st_uid=1000, st_gid=1000, st_size=5, st_atime=1560940339, 
st_mtime=1560940338, st_ctime=1560940338)

看到区别了吗?st_size不一样。

os.fstat()函数

还有一个非常相似的函数 os.fstat() ,这个函数的输入是已打开文件的file number。

>>> fp = open('a.txt','r')
>>> os.fstat(fp.fileno())
os.stat_result(st_mode=33204, st_ino=17693157, st_dev=64768, st_nlink=1,
st_uid=1000, st_gid=1000, st_size=0, st_atime=1560940275, 
st_mtime=1560940275, st_ctime=1560940275)

os.stat_result对象属性

以上三个stat函数的返回值,都是一个os.stat_result对象,我们有必要查看这个对象都有哪些属性。

st_mode,模式信息,这个信息确定了pathname对应的是一个目录,还是一个普通文件,或者是设备文件等等,还包括文件的访问权限。解析这个信息,需要用到stat模块的接口

st_ino,与OS相关,在Linux平台下就是inode编号,在Win系统下就是file index。

st_dev,文件所在的设备ID。

st_nlink,hard link硬链接的数量。(理解Linux系统的硬链接和软链接

st_uid,文件拥有者的UID。

st_gid,文件拥有者的GID。

st_size,文件大小,in bytes。

st_atime,最近一次的访问时间,单位秒。

st_mtime,最后修改时间,单位秒。

st_ctime,这个属性与OS平台有关。在Linux平台下,这个时间是最近一次修改文件metadata的时间,在Win平台下,这就是文件创建的时间。单位秒。

关于atime,mtime和ctime的更多介绍,请参考:atime,mtime和ctime

>>> import os
>>> fs = os.stat('test.txt')
>>> fs
os.stat_result(st_mode=33204, st_ino=33656274, st_dev=64768, 
st_nlink=1, st_uid=1000, st_gid=1000, 
stime=1561119755, st_ctime=1561119755)
>>> fs.st_mode
33204
>>> fs.st_ino
33656274
>>> fs.st_dev
64768
>>> fs.st_nlink
1
>>> fs.st_uid
1000
>>> fs.st_gid
1000
>>> fs.st_size
11
>>> fs.st_atime
1561119758.582074
>>> fs.st_mtime
1561119755.6539743
>>> fs.st_ctime
1561119755.6539743
>>> dir(fs)
['__add__', '__class__', '__contains__', '__delattr__', 
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
'__getattribute__', '__getitem__', '__getnewargs__', 
'__gt__', '__hash__', '__init__', '__init_subclass__', 
'__iter__', '__le__', '__len__', '__lt__', '__mul__', 
'__ne__', '__new__', '__reduce__', '__reduce_ex__', 
'__repr__', '__rmul__', '__setattr__', '__sizeof__', 
'__str__', '__subclasshook__', 'count', 'index', 
'n_fields', 'n_sequence_fields', 'n_unnamed_fields', 
'st_atime', 'st_atime_ns', 'st_blksize', 'st_blocks', 
'st_ctime', 'st_ctime_ns', 'st_dev', 'st_gid', 'st_ino', 
'st_mode', 'st_mtime', 'st_mtime_ns', 'st_nlink', 
'st_rdev', 'st_size', 'st_uid']

以上所列为os.stat_result对象的主要属性,更多属性请参考官方说明https://docs.python.org/3/library/os.html#os.stat_result

os.stat()函数的更多用法

先来看一下os.stat()函数的docstring:

>>> help(os.stat)
Help on built-in function stat in module nt:

stat(path, *, dir_fd=None, follow_symlinks=True)
    Perform a stat system call on the given path.

      path
        Path to be examined; can be string, bytes, a path-like object or
        open-file-descriptor int.
      dir_fd
        If not None, it should be a file descriptor open to a directory,
        and path should be a relative string; path will then be relative to
        that directory.
      follow_symlinks
        If False, and the last element of the path is a symbolic link,
        stat will examine the symbolic link itself instead of the file
        the link points to.

    dir_fd and follow_symlinks may not be implemented
      on your platform.  If they are unavailable, using them will raise a
      NotImplementedError.

    It's an error to use dir_fd or follow_symlinks when specifying path as
      an open file descriptor.

看得出来,上面的信息是从Win系统中打印出来的。

dir_fd参数,默认为None,如果不是None,path参数就是一个相对位置。

follow_symlinks,默认为True,表示follow symbolic link file,上面已经有示例代码了。

注意函数参数中的*符号,它表示dir_fd和follow_symlinks这两个参数在使用的时候,必须采用key=value的形式。这个函数参数定义的细节,请参考:函数参数定义中独立的*符号,什么意思?

-- EOF --

本文链接:https://www.pynote.net/archives/216

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More

麦新杰的Python笔记

Ctrl+D 收藏本页


©Copyright 麦新杰 Since 2019 Python笔记

go to top