23. 訪問文件的狀態

要求:

在某些項目中,我們需要獲得文件狀態,例如:

  1. 文件的類型(普通文件、目錄、符號鏈接、設備文件…)。

  2. 文件的訪問權限。

  3. 文件的最後的訪問/修改/節點狀態更改時間(即atime/mtime/ctime)。

  4. 普通文件的大小。

解決方案:

  1. 系統調用:標準庫os模塊中的系統調用stat獲取文件狀態。

  2. 快捷函數:標準庫os.path下一些函數,使用起來更爲簡潔。


  • 對於os.stat()方法:
os.stat(path, dir_fd, follow_symlinks)

os.stat()方法在給定路徑上執行一個stat系統調用,用來返回相關文件的系統狀態信息。path表示待檢查的路徑。

訪問軟鏈接文件時,可以使用os.stat(path, follow_symlinks=False),等價於os.lstat(path)


  • 方案1示例:
# ll
total 4
lrwxrwxrwx 1 root root  5 Sep 11 22:04 1.txt -> a.txt
-rw-r--r-- 1 root root 20 Sep 11 22:04 a.txt
drwxr-xr-x 2 root root  6 Sep 11 22:04 dir
>>> import os

>>> os.stat('a.txt')
os.stat_result(st_mode=33188, st_ino=16988195, st_dev=64768, st_nlink=1, st_uid=0, st_gid=0, st_size=20, st_atime=1568210666, st_mtime=1568210666, st_ctime=1568210666)
>>> a1 = os.stat('a.txt')

>>> a2 = os.stat('dir')

>>> a3 = os.stat('1.txt')

>>> import stat

判斷文件類型:

>>> stat.S_IS               #兩次Tab鍵
stat.S_ISBLK(   stat.S_ISDIR(   stat.S_ISFIFO(  stat.S_ISLNK(   stat.S_ISREG(   stat.S_ISUID    stat.S_ISWHT(   
stat.S_ISCHR(   stat.S_ISDOOR(  stat.S_ISGID    stat.S_ISPORT(  stat.S_ISSOCK(  stat.S_ISVTX

>>> stat.S_ISREG(a1.st_mode)             #stat.S_ISREG 判斷是否是普通文件
True

>>> stat.S_ISDIR(a2.st_mode)                #stat.S_ISDIR 判斷是否是目錄
True

>>> stat.S_ISLNK(a3.st_mode)                #stat.S_ISLNK 判斷是否是鏈接文件
False

>>> a4 = os.stat('1.txt', follow_symlinks=False)                #不加follow_symlinks=False時,軟鏈接文件1.txt等同於a.txt

>>> stat.S_ISLNK(a4.st_mode)
True

不加follow_symlinks=False時,對於軟鏈接文件1.txt,os.stat('1.txt')等同於os.stat('a.txt')

判斷文件訪問權限:

>>> stat.S_IR               #是否可讀
stat.S_IREAD  stat.S_IROTH  stat.S_IRWXG  stat.S_IRWXU  
stat.S_IRGRP  stat.S_IRUSR  stat.S_IRWXO

>>> stat.S_IW               #是否可寫
stat.S_IWGRP   stat.S_IWOTH   stat.S_IWRITE  stat.S_IWUSR

>>> stat.S_IX               #是否可執行
stat.S_IXGRP  stat.S_IXOTH  stat.S_IXUSR

>>> stat.S_IRUSR & a1.st_mode
256             #說明a.txt對於所屬用戶來說可讀

>>> stat.S_IWGRP & a1.st_mode
0               #說明a.txt對於所屬組來說不可寫

>>> stat.S_IXOTH & a1.st_mode
0               #說明a.txt對於其他用戶來說不可執行

查看atime/mtime/ctime:

# ll a.txt 
-rw-r--r-- 1 root root 20 Sep 11 22:04 a.txt
>>> import time
      
>>> time.localtime(a1.st_atime)
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=11, tm_hour=22, tm_min=4, tm_sec=26, tm_wday=2, tm_yday=254, tm_isdst=0)

>>> time.localtime(a1.st_mtime)
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=11, tm_hour=22, tm_min=4, tm_sec=26, tm_wday=2, tm_yday=254, tm_isdst=0)

>>> time.localtime(a1.st_ctime)
time.struct_time(tm_year=2019, tm_mon=9, tm_mday=11, tm_hour=22, tm_min=4, tm_sec=26, tm_wday=2, tm_yday=254, tm_isdst=0)

查看文件大小:

# ll a.txt 
-rw-r--r-- 1 root root 20 Sep 11 22:04 a.txt
>>> a1.st_size
20
  • 方案2示例:

判斷文件類型:

>>> import os

>>> os.path.isdir('dir')
True

>>> os.path.isdir('a.txt')
False

>>> os.path.isfile('a.txt')
True

獲取atime/mtime/ctime:

>>> os.path.getatime('a.txt')
1568210666.6489995

>>> os.path.getmtime('a.txt')
1568210666.6489995

>>> os.path.getctime('a.txt')
1568210666.6489995

獲取文件大小:

>>> os.path.getsize('a.txt')
20

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章