Python3 下如何获取文件的状态

实际案例

在某些项目中,我们需要获得文件状态,例如:

文件的类型(普通文件、目录、符号链接和设备文件等);
文件的访问权限;
文件的最后访问、修改和节点状态更改时间;
普通文件的大小;
……
解决方案:
- 系统调用:标准库中os模块下的三个系统调用stat,fstat,lstat获取文件状态;
- 快捷函数:标准库中os.path下一些函数,使用起来更加简洁。

os.stat 系统调用

Python
>>> import stat >>> dir(stat) ['FILE_ATTRIBUTE_ARCHIVE', 'FILE_ATTRIBUTE_COMPRESSED', 'FILE_ATTRIBUTE_DEVICE', 'FILE_ATTRIBUTE_DIRECTORY', 'FILE_ATTRIBUTE_ENCRYPTED', 'FILE_ATTRIBUTE_HIDDEN', 'FILE_ATTRIBUTE_INTEGRITY_STREAM', 'FILE_ATTRIBUTE_NORMAL', 'FILE_ATTRIBUTE_NOT_CONTENT_INDEXED', 'FILE_ATTRIBUTE_NO_SCRUB_DATA', 'FILE_ATTRIBUTE_OFFLINE', 'FILE_ATTRIBUTE_READONLY', 'FILE_ATTRIBUTE_REPARSE_POINT', 'FILE_ATTRIBUTE_SPARSE_FILE', 'FILE_ATTRIBUTE_SYSTEM', 'FILE_ATTRIBUTE_TEMPORARY', 'FILE_ATTRIBUTE_VIRTUAL', 'SF_APPEND', 'SF_ARCHIVED', 'SF_IMMUTABLE', 'SF_NOUNLINK', 'SF_SNAPSHOT', 'ST_ATIME', 'ST_CTIME', 'ST_DEV', 'ST_GID', 'ST_INO', 'ST_MODE', 'ST_MTIME', 'ST_NLINK', 'ST_SIZE', 'ST_UID', 'S_ENFMT', 'S_IEXEC', 'S_IFBLK', 'S_IFCHR', 'S_IFDIR', 'S_IFDOOR', 'S_IFIFO', 'S_IFLNK', 'S_IFMT', 'S_IFPORT', 'S_IFREG', 'S_IFSOCK', 'S_IFWHT', 'S_IMODE', 'S_IREAD', 'S_IRGRP', 'S_IROTH', 'S_IRUSR', 'S_IRWXG', 'S_IRWXO', 'S_IRWXU', 'S_ISBLK', 'S_ISCHR', 'S_ISDIR', 'S_ISDOOR', 'S_ISFIFO', 'S_ISGID', 'S_ISLNK', 'S_ISPORT', 'S_ISREG', 'S_ISSOCK', 'S_ISUID', 'S_ISVTX', 'S_ISWHT', 'S_IWGRP', 'S_IWOTH', 'S_IWRITE', 'S_IWUSR', 'S_IXGRP', 'S_IXOTH', 'S_IXUSR', 'UF_APPEND', 'UF_COMPRESSED', 'UF_HIDDEN', 'UF_IMMUTABLE', 'UF_NODUMP', 'UF_NOUNLINK', 'UF_OPAQUE', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_filemode_table', 'filemode'] >>> # -*- coding: utf-8 -*- import <span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/os" title="View all posts in os" target="_blank">os</a></span> import stat import <span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/time" title="View all posts in time" target="_blank">time</a></span> s = os.stat('c1.py') # 文件类型 print(stat.S_ISREG(s.st_mode)) # 文件的执行权限 print(s.st_mode & stat.S_IXUSR) # 文件的读权限 print(s.st_mode & stat.S_IRUSR) # 文件的最后访问时间 print(<span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/time" title="View all posts in time" target="_blank">time</a></span>.localtime(s.st_atime)) # 文件的最后修改时间 print(time.localtime(s.st_mtime)) # 文件的节点状态更改时间 print(time.localtime(s.st_ctime)) # 文件的大小 print(s.st_size)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
>>> import stat
>>> dir ( stat )
[ 'FILE_ATTRIBUTE_ARCHIVE' , 'FILE_ATTRIBUTE_COMPRESSED' , 'FILE_ATTRIBUTE_DEVICE' , 'FILE_ATTRIBUTE_DIRECTORY' , 'FILE_ATTRIBUTE_ENCRYPTED' , 'FILE_ATTRIBUTE_HIDDEN' , 'FILE_ATTRIBUTE_INTEGRITY_STREAM' , 'FILE_ATTRIBUTE_NORMAL' , 'FILE_ATTRIBUTE_NOT_CONTENT_INDEXED' , 'FILE_ATTRIBUTE_NO_SCRUB_DATA' , 'FILE_ATTRIBUTE_OFFLINE' , 'FILE_ATTRIBUTE_READONLY' , 'FILE_ATTRIBUTE_REPARSE_POINT' , 'FILE_ATTRIBUTE_SPARSE_FILE' , 'FILE_ATTRIBUTE_SYSTEM' , 'FILE_ATTRIBUTE_TEMPORARY' , 'FILE_ATTRIBUTE_VIRTUAL' , 'SF_APPEND' , 'SF_ARCHIVED' , 'SF_IMMUTABLE' , 'SF_NOUNLINK' , 'SF_SNAPSHOT' , 'ST_ATIME' , 'ST_CTIME' , 'ST_DEV' , 'ST_GID' , 'ST_INO' , 'ST_MODE' , 'ST_MTIME' , 'ST_NLINK' , 'ST_SIZE' , 'ST_UID' , 'S_ENFMT' , 'S_IEXEC' , 'S_IFBLK' , 'S_IFCHR' , 'S_IFDIR' , 'S_IFDOOR' , 'S_IFIFO' , 'S_IFLNK' , 'S_IFMT' , 'S_IFPORT' , 'S_IFREG' , 'S_IFSOCK' , 'S_IFWHT' , 'S_IMODE' , 'S_IREAD' , 'S_IRGRP' , 'S_IROTH' , 'S_IRUSR' , 'S_IRWXG' , 'S_IRWXO' , 'S_IRWXU' , 'S_ISBLK' , 'S_ISCHR' , 'S_ISDIR' , 'S_ISDOOR' , 'S_ISFIFO' , 'S_ISGID' , 'S_ISLNK' , 'S_ISPORT' , 'S_ISREG' , 'S_ISSOCK' , 'S_ISUID' , 'S_ISVTX' , 'S_ISWHT' , 'S_IWGRP' , 'S_IWOTH' , 'S_IWRITE' , 'S_IWUSR' , 'S_IXGRP' , 'S_IXOTH' , 'S_IXUSR' , 'UF_APPEND' , 'UF_COMPRESSED' , 'UF_HIDDEN' , 'UF_IMMUTABLE' , 'UF_NODUMP' , 'UF_NOUNLINK' , 'UF_OPAQUE' , '__builtins__' , '__cached__' , '__doc__' , '__file__' , '__loader__' , '__name__' , '__package__' , '__spec__' , '_filemode_table' , 'filemode' ]
>>>
 
 
# -*- coding: utf-8 -*-
 
import os
import stat
import time
 
s = os . stat ( 'c1.py' )
 
# 文件类型
print ( stat . S_ISREG ( s . st_mode ) )
 
# 文件的执行权限
print ( s . st_mode & stat . S_IXUSR )
 
# 文件的读权限
print ( s . st_mode & stat . S_IRUSR )
 
# 文件的最后访问时间
print ( time . localtime ( s . st_atime ) )
 
# 文件的最后修改时间
print ( time . localtime ( s . st_mtime ) )
 
# 文件的节点状态更改时间
print ( time . localtime ( s . st_ctime ) )
 
# 文件的大小
print ( s . st_size )

输出结果是:

➜ d3 python c1.py
True
0
256
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=26, tm_hour=11, tm_min=23, tm_sec=32, tm_wday=6, tm_yday=330, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=26, tm_hour=11, tm_min=23, tm_sec=29, tm_wday=6, tm_yday=330, tm_isdst=0)
time.struct_time(tm_year=2017, tm_mon=11, tm_mday=26, tm_hour=11, tm_min=23, tm_sec=29, tm_wday=6, tm_yday=330, tm_isdst=0)
475

快捷函数,os.path

Python
>>> import os >>> dir(<span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/os-path" title="View all posts in os.path" target="_blank">os.path</a></span>) ['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_get_sep', '_joinrealpath', '_varprog', '_varprogb', 'abspath', 'altsep', 'basename', 'commonpath', 'commonprefix', 'curdir', 'defpath', 'devnull', 'dirname', 'exists', 'expanduser', 'expandvars', 'extsep', 'genericpath', 'getatime', 'getctime', 'getmtime', 'getsize', 'isabs', 'isdir', 'isfile', 'islink', 'ismount', 'join', 'lexists', 'normcase', 'normpath', 'os', 'pardir', 'pathsep', 'realpath', 'relpath', 'samefile', 'sameopenfile', 'samestat', 'sep', 'split', 'splitdrive', 'splitext', 'stat', 'supports_unicode_filenames', 'sys'] # 最后的访问时间 In [29]: time.localtime(<span class="wp_keywordlink_affiliate"><a href="https://www.168seo.cn/tag/os-path" title="View all posts in os.path" target="_blank">os.path</a></span>.getatime('demo.txt')) Out[29]: time.struct_time(tm_year=2017, tm_mon=11, tm_mday=25, tm_hour=20, tm_min=14, tm_sec=10, tm_wday=5, tm_yday=329, tm_isdst=0) # 文件的最后修改时间 In [30]: time.localtime(os.path.getctime('demo.txt')) Out[30]: time.struct_time(tm_year=2017, tm_mon=11, tm_mday=25, tm_hour=20, tm_min=22, tm_sec=1, tm_wday=5, tm_yday=329, tm_isdst=0) # 文件的节点状态更改时间 In [31]: time.localtime(os.path.getmtime('demo.txt')) Out[31]: time.struct_time(tm_year=2017, tm_mon=11, tm_mday=25, tm_hour=20, tm_min=22, tm_sec=1, tm_wday=5, tm_yday=329, tm_isdst=0) # 获取文件的大小 In [35]: os.path.getsize('CyyIDE3.mp4') Out[35]: 5327644
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
>>> import os
>>> dir ( os.path )
[ '__all__' , '__builtins__' , '__cached__' , '__doc__' , '__file__' , '__loader__' , '__name__' , '__package__' , '__spec__' , '_get_sep' , '_joinrealpath' , '_varprog' , '_varprogb' , 'abspath' , 'altsep' , 'basename' , 'commonpath' , 'commonprefix' , 'curdir' , 'defpath' , 'devnull' , 'dirname' , 'exists' , 'expanduser' , 'expandvars' , 'extsep' , 'genericpath' , 'getatime' , 'getctime' , 'getmtime' , 'getsize' , 'isabs' , 'isdir' , 'isfile' , 'islink' , 'ismount' , 'join' , 'lexists' , 'normcase' , 'normpath' , 'os' , 'pardir' , 'pathsep' , 'realpath' , 'relpath' , 'samefile' , 'sameopenfile' , 'samestat' , 'sep' , 'split' , 'splitdrive' , 'splitext' , 'stat' , 'supports_unicode_filenames' , 'sys' ]
 
# 最后的访问时间
 
In [ 29 ] : time . localtime ( os.path . getatime ( 'demo.txt' ) )
Out [ 29 ] : time . struct_time ( tm_year = 2017 , tm_mon = 11 , tm_mday = 25 , tm_hour = 20 , tm_min = 14 , tm_sec = 10 , tm_wday = 5 , tm_yday = 329 , tm_isdst = 0 )
 
 
# 文件的最后修改时间
In [ 30 ] : time . localtime ( os.path . getctime ( 'demo.txt' ) )
Out [ 30 ] : time . struct_time ( tm_year = 2017 , tm_mon = 11 , tm_mday = 25 , tm_hour = 20 , tm_min = 22 , tm_sec = 1 , tm_wday = 5 , tm_yday = 329 , tm_isdst = 0 )
 
# 文件的节点状态更改时间
 
In [ 31 ] : time . localtime ( os.path . getmtime ( 'demo.txt' ) )
Out [ 31 ] : time . struct_time ( tm_year = 2017 , tm_mon = 11 , tm_mday = 25 , tm_hour = 20 , tm_min = 22 , tm_sec = 1 , tm_wday = 5 , tm_yday = 329 , tm_isdst = 0 )
 
 
# 获取文件的大小
In [ 35 ] : os.path . getsize ( 'CyyIDE3.mp4' )
Out [ 35 ] : 5327644



  • zeropython 微信公众号 5868037 QQ号 5868037@qq.com QQ邮箱
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值