从路径中提取文件名,无论操作系统/路径格式如何

2022-09-05 01:03:55

我可以使用哪个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

答案 1

实际上,有一个函数可以准确地返回您想要的内容

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

警告:当在 POSIX 系统上使用 os.path.basename() 从 Windows 样式的路径(例如“C:\\my\\file.txt”)获取基本名称时,将返回整个路径。

下面的例子来自在 Linux 主机上运行的交互式 python shell:

Python 3.8.2 (default, Mar 13 2020, 10:14:16)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> filepath = "C:\\my\\path\\to\\file.txt" # A Windows style file path.
>>> os.path.basename(filepath)
'C:\\my\\path\\to\\file.txt'

答案 2

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

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

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' 始终引用 a 文件夹中的文件 b\c,而在 Windows 上,它始终引用 a 文件夹的 b 子文件夹中的 c 文件。因此,当在路径中同时使用正斜杠和反斜杠时,您需要知道关联的平台才能正确解释它。在实践中,通常可以安全地假设它是Windows路径,因为反斜杠很少在Linux文件名中使用,但是在编写代码时请记住这一点,以免造成意外的安全漏洞。