要求:
在某些项目中,我们需要获得文件状态,例如:
文件的类型(普通文件、目录、符号链接、设备文件…)。
文件的访问权限。
文件的最后的访问/修改/节点状态更改时间(即atime/mtime/ctime)。
普通文件的大小。
解决方案:
系统调用:标准库os模块中的系统调用stat获取文件状态。
快捷函数:标准库os.path
下一些函数,使用起来更为简洁。
os.stat()
方法:os.stat(path, dir_fd, follow_symlinks)
os.stat()
方法在给定路径上执行一个stat系统调用,用来返回相关文件的系统状态信息。path
表示待检查的路径。
访问软链接文件时,可以使用os.stat(path, follow_symlinks=False)
,等价于os.lstat(path)
# lltotal 4 lrwxrwxrwx 1 root root 5 Sep 11 22:04 1.txt -> a.txt -rw-r--r-- 1 root root 20 Sep 11 22:04 a.txt drwxr-xr-x 2 root root 6 Sep 11 22:04 dir
>>> import os>>> os.stat('a.txt')os.stat_result(st_mode=33188, st_ino=16988195, st_dev=64768, st_nlink=1, st_uid=0, st_gid=0, st_size=20, st_atime=1568210666, st_mtime=1568210666, st_ctime=1568210666)
>>> a1 = os.stat('a.txt')>>> a2 = os.stat('dir')>>> a3 = os.stat('1.txt')>>> import stat
判断文件类型:
>>> stat.S_IS #两次Tab键stat.S_ISBLK( stat.S_ISDIR( stat.S_ISFIFO( stat.S_ISLNK( stat.S_ISREG( stat.S_ISUID stat.S_ISWHT( stat.S_ISCHR( stat.S_ISDOOR( stat.S_ISGID stat.S_ISPORT( stat.S_ISSOCK( stat.S_ISVTX>>> stat.S_ISREG(a1.st_mode) #stat.S_ISREG 判断是否是普通文件True>>> stat.S_ISDIR(a2.st_mode) #stat.S_ISDIR 判断是否是目录True>>> stat.S_ISLNK(a3.st_mode) #stat.S_ISLNK 判断是否是链接文件False>>> a4 = os.stat('1.txt', follow_symlinks=False) #不加follow_symlinks=False时,软链接文件1.txt等同于a.txt>>> stat.S_ISLNK(a4.st_mode)True
不加follow_symlinks=False
时,对于软链接文件1.txt,os.stat('1.txt')
等同于os.stat('a.txt')
。
判断文件访问权限:
>>> stat.S_IR #是否可读stat.S_IREAD stat.S_IROTH stat.S_IRWXG stat.S_IRWXU stat.S_IRGRP stat.S_IRUSR stat.S_IRWXO>>> stat.S_IW #是否可写stat.S_IWGRP stat.S_IWOTH stat.S_IWRITE stat.S_IWUSR>>> stat.S_IX #是否可执行stat.S_IXGRP stat.S_IXOTH stat.S_IXUSR>>> stat.S_IRUSR & a1.st_mode256 #说明a.txt对于所属用户来说可读>>> stat.S_IWGRP & a1.st_mode0 #说明a.txt对于所属组来说不可写>>> stat.S_IXOTH & a1.st_mode0 #说明a.txt对于其他用户来说不可执行
查看atime/mtime/ctime:
# ll a.txt -rw-r--r-- 1 root root 20 Sep 11 22:04 a.txt
>>> import time >>> time.localtime(a1.st_atime)time.struct_time(tm_year=2019, tm_mon=9, tm_mday=11, tm_hour=22, tm_min=4, tm_sec=26, tm_wday=2, tm_yday=254, tm_isdst=0)>>> time.localtime(a1.st_mtime)time.struct_time(tm_year=2019, tm_mon=9, tm_mday=11, tm_hour=22, tm_min=4, tm_sec=26, tm_wday=2, tm_yday=254, tm_isdst=0)>>> time.localtime(a1.st_ctime)time.struct_time(tm_year=2019, tm_mon=9, tm_mday=11, tm_hour=22, tm_min=4, tm_sec=26, tm_wday=2, tm_yday=254, tm_isdst=0)
查看文件大小:
# ll a.txt -rw-r--r-- 1 root root 20 Sep 11 22:04 a.txt
>>> a1.st_size20
判断文件类型:
>>> import os>>> os.path.isdir('dir')True>>> os.path.isdir('a.txt')False>>> os.path.isfile('a.txt')True
获取atime/mtime/ctime:
>>> os.path.getatime('a.txt')1568210666.6489995>>> os.path.getmtime('a.txt')1568210666.6489995>>> os.path.getctime('a.txt')1568210666.6489995
获取文件大小:
>>> os.path.getsize('a.txt')20