文件路径的 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.
「其他文章」