如何访问文件的状态?

需求:
在某些项目中,我们需要获得文件状态,例如:
1、文件的类型(普通文本,目录,符号链接,设备文件...)
2、文件的访问权限
3、文件的最后的访问/修改/节点状态更改时间(对应于读、写、和chmod,chown操作的时间)
4、普通文件大小
...

思路:
1、标准库os模块中三个系统调用stat,fstat,lstat获取文件状态
2、标准库中os.path下一些函数,使用起来更加简洁

代码:

import os
import stat
import time
s = os.stat('demo.txt')
print(s) # os.stat_result(st_mode=33188, st_ino=8409173, st_dev=64768, st_nlink=1, st_uid=0, st_gid=0, st_size=8192, st_atime=1594735547, st_mtime=1594735547, st_ctime=1594735547)
s1 = os.lstat('x.txt')  # x.txt为demo.txt的软链接,lstat不跟随软链接,查看的是x.txt本身文件的信息。os.stat('x.txt')查看的还是demo.txt文件的信息
print(s1)
os.fstat(open('demo.txt').fileno())  # fstat()接的是文件描述符,fileno()方法可以等到文件的描述符

# 获取文件的类型,文件的类型由st_mode这个参数来决定的
filetype = s.st_mode # 实际是由一些标志位来构成的
# 转化成二进制
bfiletype = bin(filetype)  # '0b1000000110100100'
# 解析上面的数据
print(stat.S_ISDIR(s.st_mode)) # 判断是否是个文件夹,返回True或者False
print(stat.S_ISREG(s.st_mode)) # 判断是否是个普通文件

# 获取文件的权限,文件的权限还是在st_mode里面
print(s.st_mode & stat.S_IRUSR) # 判断这个文件用户有没有读权限,返回的数如果大于0,则为真
print(s.st_mode & stat.S_IXUSR) # 判断这个文件用户有没有执行的权限,返回的是0,则为假

# 获取文件的最后的访问/修改/节点状态更改时间
print(s.st_atime) # 返回1594735547.4838142秒
# 获取结构化的时间,即转换成常用的时间
atime = time.localtime(s.st_atime) # time.struct_time(tm_year=2020, tm_mon=7, tm_mday=14, tm_hour=22, tm_min=5, tm_sec=47, tm_wday=1, tm_yday=196, tm_isdst=0)
print(atime)

# 获取普通文件的大小
print(s.st_size)  # 返回8192字节的大小

# 使用os.path方法下面的一些方法来更加快捷的完成上面的操作
# 判断文件的类型
print(os.path.isfile('x.txt'))  # 判断是否是个目录返回False
print(os.path.islink('x.txt'))  # 判断是否是个符号链接,返回True
print(os.path.isfile('x.txt'))  # 判断是否是个普通文件,返回True

# 判断文件的访问权限,使用上面的方法,这里没有相关介绍
# 获取文件的三个时间
print(os.path.getatime('x.txt')) # 返回1594735547.4838142

# 获取普通文件大小
print(os.path.getsize('x.txt'))  # 返回8192bytes

==========================================================

>>> ll
总用量 4
-rw-r--r-- 1 richardo    0 11月  3 22:38 a.txt
-rwxr--r-- 1 richardo    0 11月  3 22:38 b.py*
drwxr-xr-x 2 richardo 4096 11月  3 22:38 d/
lrwxrwxrwx 1 richardo    5 11月  3 22:39 l.txt -> a.txt

>>> import os

>>> os.stat('a.txt')
os.stat_result(st_mode=33188, st_ino=925077, st_dev=66312, st_nlink=1, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604414295, st_mtime=1604414295, st_ctime=1604414295)

>>> fd = os.open('b.py',os.O_RDONLY)

>>> fd
12

>>> os.read(fd,10)
b''

>>> s = os.stat('a.txt')

>>> ll a.txt
-rw-r--r-- 1 richardo 0 11月  3 22:38 a.txt

>>> ll l.txt
lrwxrwxrwx 1 richardo 5 11月  3 22:39 l.txt -> a.txt

>>> ll /dev/fb0
crw-rw---- 1 root 29, 0 11月  3 16:36 /dev/fb0

>>> bin(s.st_mode)
'0b1000000110100100'

>>> s2 = os.stat('d')

>>> bin(s2.st_mode)
'0b100000111101101'

>>> os.stat('/proc')
os.stat_result(st_mode=16749, st_ino=1, st_dev=5, st_nlink=333, st_uid=0, st_gid=0, st_size=0, st_atime=1604392569, st_mtime=1604392569, st_ctime=1604392569)

>>> ll
总用量 4
-rw-r--r-- 1 richardo    0 11月  3 22:38 a.txt
-rwxr--r-- 1 richardo    0 11月  3 22:38 b.py*
drwxr-xr-x 2 richardo 4096 11月  3 22:38 d/
lrwxrwxrwx 1 richardo    5 11月  3 22:39 l.txt -> a.txt

>>> s = os.stat('a.txt')

>>> s
os.stat_result(st_mode=33188, st_ino=925077, st_dev=66312, st_nlink=2, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604414295, st_mtime=1604414295, st_ctime=1604415132)

>>> import stat

>>> s3 = os.stat('l.txt')

>>> stat.S_IFDIR & s.st_mode
0

>>> stat.S_IFCHR & s.st_mode
0

>>> stat.S_IFREG & s.st_mode
32768

>>> stat.S_ISREG(s.st_mode)
True

>>> stat.S_ISLNK(s2.st_mode)
False

>>> stat.S_ISLNK(s3.st_mode)
False

>>> os.stat('l.txt')
os.stat_result(st_mode=33188, st_ino=925077, st_dev=66312, st_nlink=2, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604414295, st_mtime=1604414295, st_ctime=1604415132)

>>> os.stat('a.txt')
os.stat_result(st_mode=33188, st_ino=925077, st_dev=66312, st_nlink=2, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604414295, st_mtime=1604414295, st_ctime=1604415132)

>>> os.stat('l.txt',follow_symlinks=False)
os.stat_result(st_mode=41471, st_ino=925091, st_dev=66312, st_nlink=1, st_uid=1000, st_gid=1000, st_size=5, st_atime=1604414369, st_mtime=1604414368, st_ctime=1604414368)

>>> os.lstat('a.txt')
os.stat_result(st_mode=33188, st_ino=925077, st_dev=66312, st_nlink=2, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604414295, st_mtime=1604414295, st_ctime=1604415132)

>>> os.lstat('l.txt')
os.stat_result(st_mode=41471, st_ino=925091, st_dev=66312, st_nlink=1, st_uid=1000, st_gid=1000, st_size=5, st_atime=1604414369, st_mtime=1604414368, st_ctime=1604414368)

>>> stat.S_IRUSR & s.st_mode
256

>>> stat.S_IXOTH & s.st_mode
0

>>> s
os.stat_result(st_mode=33188, st_ino=925077, st_dev=66312, st_nlink=2, st_uid=1000, st_gid=1000, st_size=0, st_atime=1604414295, st_mtime=1604414295, st_ctime=1604415132)

>>> import time

>>> time.localtime(s.st_atime)
time.struct_time(tm_year=2020, tm_mon=11, tm_mday=3, tm_hour=22, tm_min=38, tm_sec=15, tm_wday=1, tm_yday=308, tm_isdst=0)

>>> ll a.txt
-rw-r--r-- 2 richardo 0 11月  3 22:38 a.txt

>>> os.path.isdir('d')
True

>>> os.path.isdir('a.txt')
False

>>> os.path.isfile('a.txt')
True

>>> os.path.getatime('a.txt')
1604414295.0989428

>>> os.path.getsize('a.txt')
0

>>> 

原文地址:https://www.cnblogs.com/Richardo-M-Q/p/13326211.html