1、常见路径形式
主要形式是下面三种。后面两种实际指向同一个位置(如果path
是一个已存在的文件夹),但处理结果会有所差异。
- /path/name.ext
- /path
- /path/
注意:pathlib
将后面两种视为同样的路径。
当然还有相对路径,比如./path/name.ext
或path/name.ext
,没有本质区别。
另外 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
(os.path.splitext
也是这样处理的)。
接下来是 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.