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