在Windows下是否有一个相当于os.path.basename的路径库?

bzzcjhmw  于 2022-11-18  发布在  Windows
关注(0)|答案(1)|浏览(135)

在Windows 10上运行Python 3.9.5时:

  • Path("c:/temp/one/two/").name == "two"
  • PurePath("c:/temp/one/two/").name == "two"
  • PureWindowsPath("c:/temp/one/two/").name == "two"

同时

  • os.path.basename("c:/temp/one/two/").name == ""
hgc7kmma

hgc7kmma1#

根据Python文档,os.path.basename只是简单地使用.split(),因此它是一个相当初级的实现(文档中甚至明确提到不要期望得到与Unix“basename”程序相同的结果)。
pathlib中,PathPurePathPureWindowsPath对象更为复杂。它们可以表示文件、目录或其他内容。在调用其方法之前,对象不会对其所表示的内容做出任何假设因此Path("c:/temp/one/two/").name将返回two,因为two只是one中的一个子目录(Path对象不关心它是文件还是目录)。
要使用os.path.basename获得奇偶校验,可以执行以下操作

p = Path("c:/temp/one/two/")
("" if p.is_dir() else p.name) == ""

或者,如果你想要一个单行程序(在Python 3.9+上):

("" if (p := Path("c:/temp/one/two/")).is_dir() else p.name) == ""

顺便说一下,os.path.basename确实接受Path对象作为参数。* 但是 *,行为是不同的:

Python 3.10.5 (tags/v3.10.5:f377153, Jun  6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.28.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import os

In [2]: from pathlib import Path

In [3]: os.path.basename('c:/one/two/three/')
Out[3]: ''

In [4]: os.path.basename(Path('c:/one/two/three/'))
Out[4]: 'three'

相关问题