QQ个性网:专注于分享免费的QQ个性内容

关于我们| 网站公告| 广告服务| 联系我们| 网站地图

搜索
编程 JavaScript Java C++ Python SQL C Io ML COBOL Racket APL OCaml ABC Sed Bash Visual Basic Modula-2 Logo Delphi IDL Groovy Julia REXX Chapel X10 Forth Eiffel C# Go Rust PHP Swift Kotlin R Dart Perl Ruby TypeScript MATLAB Shell Lua Scala Objective-C F# Haskell Elixir Lisp Prolog Ada Fortran Erlang Scheme Smalltalk ABAP D ActionScript Tcl AWK IDL J PostScript IDL PL/SQL PowerShell

关于文件,你真的了解吗?Python使用stat模块详细获取文件信息

日期:2025/04/03 21:35来源:未知 人气:53

导读:前篇内容我们介绍了Python中关于文件的处理及磁盘文件读写机制(参见你了解文件缓存机制吗?磁盘文件如何读写?Python中open函数详解)。今天,我们来详细了解一下使用Python如何获取文件的详细信息。准备好了吗?开始学习了不同系统的文件处理机制我们知道,对于文件,不同的操作系统有着不同的处理机制:比如Linux操作系统,它秉持“一切皆文件”的理念,大到一个系统文件,小到......

前篇内容我们介绍了Python中关于文件的处理及磁盘文件读写机制(参见你了解文件缓存机制吗?磁盘文件如何读写?Python中open函数详解)。今天,我们来详细了解一下使用Python如何获取文件的详细信息。

准备好了吗?开始学习了

不同系统的文件处理机制

我们知道,对于文件,不同的操作系统有着不同的处理机制:

比如Linux操作系统,它秉持“一切皆文件”的理念,大到一个系统文件,小到一个配置或日志文件,甚至系统运行状态、进程、挂载磁盘等信息,都是通过系统内的文件展现给我们。另一方面,对于这些文件的处理,Linux系统有一套完善的权限分配机制,不同的用户和用户组对于该文件有不同的读、写及执行权限。

linux系统“一切皆文件”

Windows系统虽然也有明确的权限分配机制,但是作为使用者,我们平时基本感觉不到这种权限分配的过程(除非出于安全考虑对某些文件进行特定的权限设置)。系统使用者登录到操作系统后,当他读写一个文件时,操作系统会频繁锁定该用户对于文件的独占访问。

微软视窗模式

上面两种操作系统之间的区别其实大家日常使用中也能发现:比如,你使用Windows观看一个视频文件,当你试图删除或者重命名该文件时,系统会提示文件正在被占用而无法执行这类操作;而Linux系统则不然,当你在Linux系统中观看视频的同时,你可以重命名该视频文件或者删除它都可以。对于具有root权限的用户,甚至可以使用'rm -rf /'清空系统内所有内容(对于专业人士来讲,非常人性化的一个设计)。

观看视频时是否可以操作文件

我们知道,一般Linux系统中都是默认安装Python的(Windows为什么不默认安装呢?有限的系统空间应该留给收费软件,你说呢?)

通过上面的分析,对于文件的操作,比如该文件是否可读、写,可执行,是否应该被独占,系统是如何判断呢?聪明的小伙伴可能猜到了,是通过文件的属性来判断的。那么,作为Python如何获取文件系统中任意文件的属性信息呢?

获取文件信息

Python内置os模块中的stat()方法可以用来获取一个文件的属性及状态信息

os.stat(path, *, dir_fd=None, follow_symlinks=True)

path:指定为一个字符串或一个打开的文件描述符

dir_fd:该参数仅适用于Unix平台,不适用Windows平台;如果不为空,它应该是一个指向目录的文件描述符,此时要操作的路径应该是相对路径;如果路径是绝对路径,则忽略该参数

follow_symlinks:该参数如果为False,并且要操作的路径的最后一个元素是符号链接,则该函数将在符号链接本身,而不是链接指向的文件(好绕口)。简单来讲,如果path中传入一个快捷方式,并且该参数设为False(默认为True),则stat返回的结构是快捷方式信息,而不是它指向的文件本身。

貌似后两个参数都没什么卵用。

下面我们来分别看一下如何使用该函数获取文件信息。

文件信息有哪些呢?

import os

f_info = os.stat('windows-version.txt')

f_info

os.stat_result(st_mode=33206, st_ino=281474977063003, st_dev=3125222198, st_nlink=1, st_uid=0, st_gid=0, st_size=37, st_atime=1577196217, st_mtime=1577196217, st_ctime=1577196166)

返回一个stat_result元组对象,我们看下都有哪些属性:

st_mode:文件模式,文件类型和文件模式位(权限)。

st_ino:inode 节点号。

st_dev:该文件所在设备的标识符。

st_nlink:硬链接的数量。

st_uid:文件所有者的用户标识符。

st_gid:文件所有者的组标识符。

st_size:文件大小(以字节为单位),如果是常规文件或符号链接。符号链接的大小是它所包含的路径名的长度,而不是终止的空字节。

st_atime:最近访问的时间以秒表示。

st_mtime:最近的内容修改时间以秒表示。

st_ctime:取决于平台:Unix上最新的元数据更改时间,在Windows上创建的时间,以秒表示。

st_atime_ns:最近访问的时间以纳秒表示,以整数表示。

st_mtime_ns:最新内容修改的时间以纳秒表示,以整数表示。

st_ctime_ns:取决于平台:Unix上最新的元数据更改时间,在Windows上创建的时间,以纳秒为单位表示为整数。那么,问题是这些信息如何识别并利用呢?

os.stat和stat模块的区别

细心的小伙伴肯定发现了,Python中除了os.stat()方法,还提供了一个stat模块,这两者有什么区别呢?

简单来讲,os.stat()方法是把文件的属性读取出来并以stat_result元组对象形式返回,但是它的部分实现是通过调用stat模块来实现的,当然这种实现并不是很容易让人理解。比如:我们获取到的属性st_mode=33206, st_ino=281474977063003, st_dev=3125222198, st_nlink=1, st_uid=0, st_gid=0等之后,还是不知道这些属性代表的意义,那么,我们还需要用stat模块中提供的接口来进一步进行处理。

下面我们利用前面获取到的属性值,将它还原为我们能读懂的属性内容。

更加人性化的信息展示

还原属性本质

获取文件具体属性值一般是这样的

1.判断文件类型:

mode = f_info[0]

mode = s[0]

if stat.S_ISREG(mode): #判断是否一般文件

print('一般文件.')

elif stat.S_ISLNK(mode): #判断是否链接文件

print('链接文件.')

elif stat.S_ISSOCK(mode): #判断是否套接字文件

print('套接字文件.')

elif stat.S_ISFIFO(mode): #判断是否命名管道

print('命名管道.')

elif stat.S_ISBLK(mode): #判断是否块设备(硬盘等)

print('块设备.')

elif stat.S_ISCHR(mode): #判断是否字符设备(键鼠)

print('字符设备.')

elif stat.S_ISDIR(mode): #判断是否目录

print('目录.')

2.读取权限信息

比如,我们需要知道文件的权限可以使用oct(mode)将权限信息转化为类似“0o100666”这样的内容,后三位就是权限信息(参见Linux权限相关内容)。获取Windows系统文件权限貌似意义不大。

3.读取并设置时间

我们看到,stat_result元组中有st_atime、st_mtime、st_ctime*这样的时间属性,分别表示访问、修改、修改时间。它们是表示时间戳的一串整形数据,对于时间的设置及读取,我们后面专题进行讨论,这里就不再赘述了。

4.设置st_mode属性

stat.S_ISUID: 执行时设置用户ID

stat.S_ISGID: 执行时设置组ID

stat.S_ENFMT: 强制记录锁定

stat.S_ISVTX: 执行之后保存文字和图片

stat.S_IREAD: 所有者的读权限

stat.S_IWRITE: 所有者的写权限

stat.S_IEXEC: 所有者的执行权限

stat.S_IRWXU: 所有者的读写执行的权限

stat.S_IRUSR: 所有者的读权限

stat.S_IWUSR: 所有者的写权限

stat.S_IXUSR: 所有者的执行权限

stat.S_IRWXG: 同组用户的读写权限

stat.S_IRGRP: 同组用户的读权限

stat.S_IWGRP: 同组用户的写权限

stat.S_IXGRP: 同组用户的执行权限

stat.S_IRWXO: 其它组用户的读写执行权限

stat.S_IROTH: 其它组用户的读权限

stat.S_IWOTH: 其它组用户的写权限

stat.S_IXOTH: 其它组用户的执行权限

改变某一信息,直接拿mode与相应的stat.S_XXX执行'&'操作即可。我们通常使用os.chmod()来改变一个文件的属性信息。如下:

os.chmod('windows-version.txt', f_info.st_mode & stat.S_IXUSR)

这样,将该文件就有了所有者的执行权限。这样的权限设置对于Windows系统来说意义不大,但是Linux系统使用这种方式可以替代内部的Shell实现,多了一种方案,不是吗?在进行网络安全编程时,使用Python改变文件属性也是个常用的操作,大家务必要掌握哦。

对于上述属性不是很清楚的小伙伴,抓紧时间恶补Linux系统管理的知识吧,这是个很有用、很人性化的系统(比较图形界面),时间长了大家一定会喜欢这个系统的,不信你试试!给大家推荐一本Linux的书。一本是基础知识,一本是服务器架设相关知识,书写得通俗易懂,可以作为工具书使用,我买了两年了,至今还在读……读了这两本书基本就算Linux系统管理入门了。

基础学习知识:

鸟哥的Linux私房菜(第3版) 基础学习篇 鸟哥 京东¥77.44购买

已下架

服务器架设知识(喜欢自己建站和网路安全的小伙伴一定要读哦):

另外,推荐一本关于Python的极客编程的书籍,里面讲解了很多实用的案例,喜欢的小朋友抓紧时间入手哦。

好了,今天的内容就到这里了。对于文件属性的获取和改变,你了解了吗?应该知道,这些属性大部分内容是针对Linux系统来获取的,但是这些方法大部分同样适用于Windows系统(除非文档特殊说明)。

喜欢的朋友们点个关注吧。欢迎大家留言讨论。爱好Python编程的小伙伴关注我,后续会陆续推出一些有关Python实战的小技巧。

转载请注明出处,百家号:Python高手养成

关于我们|网站公告|广告服务|联系我们| 网站地图

Copyright © 2002-2023 某某QQ个性网 版权所有 | 备案号:粤ICP备xxxxxxxx号

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告