【问题标题】:Is there a pathlib equivalent to os.path.basename under Windows?Windows下是否有相当于os.path.basename的pathlib?
【发布时间】:2022-11-08 18:43:44
【问题描述】:

在 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 == ""

【问题讨论】:

  • os.path.basename(os.path.realpath("C:/temp/one/two/")) 还是 os.path.basename(os.path.normpath("C:/temp/one/two/"))
  • 对不起,我的问题并不完全清楚。我正在寻找一个 pathlib 等效项,它将返回与 os.path.basename("c:/temp/one/two/") 返回相同的内容,即空字符串 ""

标签: python python-3.x windows pathlib


【解决方案1】:

根据Python documentationos.path.basename 只需使用.split()。因此,这是一个相当基本的实现。 (文档甚至明确提到不要期望与 Unix“基本名称”程序相同的结果。)

pathlib 中,PathPurePathPureWindowsPath 对象更加复杂。它们可以代表一个文件、一个目录或其他东西。在您调用它的方法之前,该对象不会对其表示的内容做出任何假设(例如.is_file())。因此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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2010-09-23
    相关资源
    最近更新 更多