檔案路徑的 Python 處理

語言: CN / TW / HK

1. 常見路徑形式

主要形式是下面三種。後面兩種實際指向同一個位置(如果 path 是一個已存在的資料夾),但處理結果會有所差異。

path1 = /path/name.ext
path2 = /path
path3 = /path/

注意: pathlib 將後面兩種視為同樣的路徑。

當然還有相對路徑,比如 ./path/name.ext./path ,沒有本質區別。

另外 Windows 路徑因為帶碟符,會更復雜一些。可以將碟符視為一種根目錄路徑。

2. Python2 的 os.path

os.path.split 首先可以將路徑分拆為路徑和檔名:

import os 

os.path.split("/path/name.ext")  # ['/path', 'name.ext']
os.path.split("/path/")  # ['/path', '']
os.path.split("/path")  # ['/', 'path']

如果只需要獲取其中一項,可以直接用 os.path.dirname()os.path.basename()

然後 os.path.splitext 可以將 basename 繼續拆分為兩段,其中後一段是字尾(帶"."):

os.path.splitext("name.tar.gz") # ['name.tar', '.gz']

3. Python3 的 pathlib

在 Python2 裡大家一般使用 os.path ,但在 Python3 裡引入了 pathlib ,對於路徑有更多的處理。

但一個很大的區別在於, pathlib 會自動去掉路徑結尾的 / ,這使得 /path/path/ 被認為一模一樣(個人覺得還是 python2 裡的 os.path 的處理更合理一些)。

路徑 parent name suffix stem
/path/name.ext /path name.ext .ext name
/path / path `` path
/path/ / path `` path

注意事項:

  • 上面幾個不是函式,是成員。 pathlib.Path("./abc").stem ,不是 pathlib.Path("./abc").stem()
  • suffix 包含"."。
  • suffixstem 的區分是最後一個 . ,比如 file.tar.gz 對應的 suffixstem 分別是 .gzfile.tar

接下來是 pathlib 能提供的更多一些的功能:

  • path.parts ,直接拆成元件,比如 Path("/data/a.tar").parts = ["/", "data", "a.tar"]
  • path.suffixes ,返回字尾陣列,比如 Path("a.tar.gz").suffixes = [".tar", ".gz"]
  • path.parents ,返回父路徑陣列,比如 Path("/data/dir/a.bin").parents = ["/data/dir", "/data/", "/"]
  • path.root ,返回根目錄。絕對路徑返回 / 或者碟符。 相對路徑返回空

Q. E. D.