python文件路徑處理 --- os.path


路徑字符串

磁盤將數據寫入各個扇區中,使數據分散在各個未使用的塊上來儲存數據。並用一套文件系統對數據進行管理,微觀上,文件系統使用INode結構體來記錄這些塊區的地址以及數據的先后順序,實現對這些亂序儲存的數據管理。宏觀上,為了方便用戶的管理,使用路徑字符串的方式來“描述”文件的位置,但這只是一種邏輯位置,並不存在此種數據上的層級關系,一個文件字符串在將會映射到一個的INode結構體中,再使用iNode結構體實現對數據的操作。

當對數據進行拷貝,跨分區的移動等涉及磁盤塊上數據移動操作時,將需要進行文件IO操作,此時為了定位數據位置,宏觀上,用戶使用路徑字符串的方式去尋找這些數據。此時,對文件的操作被封裝成了對一個個路徑字符串的操作。

os模塊的路徑操作

當前工作目錄

默認為當前文件所處的目錄,是工作目錄路徑,而不是這個文件的路徑,文件路徑為__file__

# 獲取當前的工作目錄
os.getcwd()
os.path.dirname(__file__)

更改當前的工作目錄

當我們使用相對路徑指定文件的時, 默認的絕對路徑是 “當前工作目錄” + “文件路徑”,而當前工作目錄默認為這個文件所處的目錄。我們可以將其指定到其他的目錄中去

os.getcwd()             # 獲取當前路徑
os.chdir("d:")          # 改變這個工作目錄當 d: 盤下, 根盤符開始,是絕對路徑
os.chdir("config")      # 這是一個相對路徑,會在當前的工作目錄下找 config 目錄,然后切換當這個config目錄中

增刪目錄

os.mkdir(path)   # path如果絕對路徑,在這個絕對路徑下創建,否則在當前工作目錄下創建。 
os.makedirs(path1/path2/path3/...) 創建多級目錄 
os.rmdir(path)      # 刪除目錄
os.removedirs(path1/path2...) # 刪除多級目錄,每級目錄必須為空才可以刪除。
os.sep              # 當前操作系統所使用的路徑分隔符

walk遍歷目錄樹

遍歷一個目錄下的所有文件,可以使用walk遍歷。walk使用深度遍歷優先方式。

os.walk("path")   # 依次遞歸遍歷這個目錄並返回一個生成器,每次一個三元組。
# 每次next返回的三元組 ("正在遍歷目錄路徑", [子目錄列表],[子文件列表] )

調用系統中的可執行文件

使用os.system(path) 可以執行這個可執行文件,例如,打開微信客戶端,打開cmd命令行等

os.system("cmd")   # 可以打開命令行終端,並可以實現交互

os.system("d:\python.exe ")   # 絕對路徑下使用搜尋可執行文件,存在就執行這個文件。

幾個os模塊方法

os.name()             Windows是nt,Linux是Posix
os.uname()           *nix支持
os.platform()        平台架構win32(swindows),linux
os.stat(path, dir_fd=None, follow_symlinks=True)
     path = 路徑或者文件描述符
     follow_symlinks = True 默認跟蹤軟鏈接,
os.lstat() 同上,默認不跟蹤軟鏈接 
os.chmod(path, mode, dir_fd=None, follow_symlinks=True)
os.chown(path, uid, gid)
os.getcwd()
os.system()
os.chdir()
os.stat(".")

os.path模塊

文件路徑字符串作為一種特殊的字符串(作為文件的映射),需要根據文件的管理過程中的常用操作方式,提供一些方便的方法對這些路徑字符串進行對應的操作,例如,拼接,分割,取父目錄,取文件名等來實現文件的操作規則。

os.ltsep = "/"             # 默認分割符號,不同的操作系統不同
os.path.abspath(path)
os.path.relpath(path, start=os.curdir)   # 從strat路徑到path路徑的相對路徑表示方式。路徑字符串游戲而已,實際路徑不存在。
--------------------------------------------
os.path.basename(path) 
os.path.dirname(path) 
--------------------------------------------
os.path.commonpath(paths)       # 返回最長的相同的父路徑
os.path.commonprefix(list)      # 從左到右最長的相同字符串
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
# 共同的前綴,以字符串的方式進行計算。相同的字符均可。
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
# 共同的父目錄字符串
--------------------------------------------
os.path.exists(path) 
# 判斷這個路徑是否在當前文件系統中存在,此時才會真實驗證路徑的存在性
# path還可以是一個數字,將作為文件描述符檢測是否存在。
# 存在返回True, 不存在返回False
os.path.lexists(path)
# 是否存在這個 link 軟鏈接文件
-------------------------------------------
os.path.expanduser(path) 
os.path.expandvars(path) 
-------------------------------------------
os.path.getatime(path)     # 返回對應文件的最新的access time,不存在或者不可訪問報錯
os.path.getmtime(path)     # 返回對應文件的最新的modify time,不存在或者不可訪問報錯
os.path.getctime(path)     # 返回對應文件的最新的create time,不存在或者不可訪問報錯
os.path.getsize(path)      # 獲取文件 字節 長度.不存在或者不可訪問報錯
-------------------------------------------
os.path.isabs(path)        # 判斷是否為絕對路勁. posix 以根,windows 以磁盤盤符號
os.path.isfile(path) 
os.path.isdir(path) 
os.path.islink(path) 
------------------------------------------
os.path.join(path, *paths)    # 拼接字符串,POSIX和Windows默認拼接符不同
os.path.normcase(path)        # Normalize the case of a pathname
os.path.normpath(path)        # 將路徑字符串規范統一化,Windows會調用normcase(path)
# 一些復雜的路徑如 A//B, A/B/, A/./B and A/foo/../B 變成最簡路徑 A/B. 
os.path.samefile(path1, path2)
# 判斷兩個路徑是否指向同一個文件,根據指向同一個inode編號判斷
os.path.sameopenfile(fp1, fp2)
# 打開的是同一個文件返回True
os.path.samestat(stat1, stat2)
# 指向相同的文件返回True. 
os.path.split(path) 
# 分割父目錄和基名
os.path.split("c:\\temp\\jdd\\ddd\\daa")
# ('c:\\temp\\jdd\\ddd', 'daa')
os.path.splitext(path)
# 分割基名后綴,
os.path.splitext("c:\\temp\\jdd\\ddd\\daa.tar")
# ('c:\\temp\\jdd\\ddd\\daa', '.tar')
#只有.bashrc 返回(.bashrc, "")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM