文件路径的 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.