问题24:如何访问文件的状态

Posted Volcano!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了问题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:文件操作

 

以上是关于问题24:如何访问文件的状态的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段13——Vue的状态大管家

VSCode自定义代码片段13——Vue的状态大管家

这些角度电子邮件指令代码片段如何连接

如果几何着色器处于活动状态,如何将信息从顶点着色器传递到片段着色器?

VS 2010 中的 C++ 调试访问冲突

从第二个片段访问时 ViewModel 数据丢失状态