协慌网

登录 贡献 社区

无论 OS / 路径格式如何,都从路径中提取文件名

无论使用哪种操作系统或路径格式,我都可以使用哪个 Python 库从路径提取文件名?

例如,我希望所有这些路径都可以返回c

a/b/c/
a/b/c
\a\b\c
\a\b\c\
a\b\c
a/b/../../a/b/c/
a/b/../../a/b/c

答案

实际上,有一个函数可以完全返回您想要的

import os
print(os.path.basename(your_path))

像其他建议一样,使用os.path.splitos.path.basename并非在所有情况下都有效:如果您在 Linux 上运行脚本并尝试处理经典的 Windows 样式路径,它将失败。

Windows 路径可以使用反斜杠或正斜杠作为路径分隔符。因此, ntpath模块(在 Windows 上运行时等效于 os.path)将适用于所有平台上的所有(1)路径。

import ntpath
ntpath.basename("a/b/c")

当然,如果文件以斜杠结尾,则基名将为空,因此请使用您自己的函数来处理它:

def path_leaf(path):
    head, tail = ntpath.split(path)
    return tail or ntpath.basename(head)

验证:

>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c', 
...     'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']


(1)有一个警告:Linux 文件名可能包含反斜杠 。所以在 Linux 上, r'a/b\c'总是指文件b\ca文件夹中,而在 Windows,它始终指向c在文件b中的子文件夹a文件夹。因此,在路径中同时使用正斜杠和反斜杠时,您需要了解关联的平台才能正确解释它。实际上,通常可以安全地假设它是 Windows 路径,因为 Linux 文件名中很少使用反斜杠,但是在编写代码时请记住这一点,以免造成意外的安全漏洞。

os.path.split是您要寻找的功能

head, tail = os.path.split("/tmp/d/a.dat")

>>> print(tail)
a.dat
>>> print(head)
/tmp/d