文件路徑的 Python 處理
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
包含"."。 -
suffix
和stem
的區分是最後一個.
,比如file.tar.gz
對應的suffix
和stem
分別是.gz
和file.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.
「其他文章」