问题24:如何访问文件的状态
一、案例:在某些项目中,需要获取文件的状态
文件状态:os.stat(path)
1、文件的类型:普通文件、目录、符号链接、设备文件或管道(一般在Linux上)。。。
2、文件的访问权限:一般为读、写、执行,3个权限;
3、文件的最后的访问时间(对应read操作)、最后的修改时间(对应write操作)、最后的节点状态更改时间(对应的chang_move、chang_name的操作)
4、获取普通文件的大小,也就是字节数
#普通文件:如.py、.txt、.csv等;
#目录文件:目录d/
#符号链接文件:x.txt -> a.txt,也就是x.txt引用了普通文件a.txt
二、Python中如何获取文件的状态
方法一:系统调用
标准库os模块下的三个系统调用:stat、fstat、lstat,获取文件状态;
1)os.stat(path)、os.lstat(path)、os.fstat(fileno):获取指定文件的状态;
2)stat和lstat的差异:表现在对符号链接文件的操作,如x.txt -> a.txt:
#os.lstat('x.txt'):返回符号链接x.txt文件的状态;
#os.stat('x.txt'):返回的是a.txt文件的状态,因为stat,要跟随符号链接,指向a.txt文件;
3)fstat和stat功能一样,差异:os.fstat()操作的是文件的描述符(fileno),不是文件路径;
#关于文件描述符,可参考:问题23:如何将文件映射到内存
方法二:快捷函数
标准库中os.path下的一些函数;#更加简洁
#可参考:Python:文件操作
三、实例查看文件状态(采用方法一)
1)得到文件类型:os.stat('test.txt').st_mode
import os f = open('test.txt', 'w') s = 'abcde' f.write(s) f.close() #得到文件状态 test = os.stat('test.txt') #查看文件状态 print(test) #输出:os.stat_result(st_mode=33206, st_ino=562949953421655, st_dev=995426, st_nlink=1, st_uid=0, st_gid=0, st_size=5, st_atime=1523433493, st_mtime=1523588571, st_ctime=1523433493) #文件类型存放在st_mode中 print(test.st_mode) #输出:33206 #33206实际上是一些标志位构成的; #将状态的标志位转换为二进制(用bin函数),也就是解析此标志位,可直观看出33206所表示的标志位 print(bin(test.st_mode)) #输出:0b1000000110110110
import stat
#查看stat模块的功能
print(help(stat))
2)查看文件权限:
import stat #stat.S_ISDIR:判断文件是不是目录,若是,返回True,否则返回False s1 = stat.S_ISDIR(test.st_mode) #stat.S_ISREG:判断文件是不是普通文件; s2 = stat.S_ISREG(test.st_mode) #stat.S_ISBLK:判断是否是块设备; #查看文件的读权限,通过与stat.S_IRUSR(读权限)取交集,来看文件是否有读权限; test.st_mode & stat.S_IRUSR #查看用户对文件的执行权限 test.st_mode & stat.S_IXUSER #查看其它人对文件的执行权限 test.st_mode & stat.S_IXOTH
3)查看文件的三个时间状态,访问、修改、更新:os.stat('test.txt').st_atime/st_mtime/st_ctime
import os f = open('test.txt', 'w') s = 'abcde' f.write(s) f.close() #得到文件状态 test = os.stat('test.txt') #查看文件状态 print(test) #输出:os.stat_result(st_mode=33206, st_ino=562949953421655, st_dev=995426, st_nlink=1, st_uid=0, st_gid=0, st_size=5, st_atime=1523433493, st_mtime=1523588571, st_ctime=1523433493)
#查看3个时间,并通过time模块下的locatime()方法将秒改为现代时间
import time
#查看最近的访问时间:test.st_time
print(time.locatime(test.st_atime))
#查看最近修改时间:test.st_mtime
print(time.locatime(test.st_mtime))
#查看最近节点状态更新时间:test.st_ctime
print(time.locatime(test.st_ctime))
4)查看文件大小
#输出:os.stat_result(st_mode=33206, st_ino=562949953421655, st_dev=995426, st_nlink=1, st_uid=0, st_gid=0, st_size=5, st_atime=1523433493, st_mtime=1523588571, st_ctime=1523433493) #查看文件大小:字节数 print(test.st_size)
四、实例查看文件状态(采用方法一)
标准库中os.path下的一些函数;#更加简洁
#可参考:Python:文件操作