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

1324 投票
23 回答
2254047 浏览
提问于 2025-04-17 07:43

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

23 个回答

390

os.path.split 是你需要的那个函数

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

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

有一个函数可以完美满足你的需求。

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

注意:如果在POSIX系统上使用os.path.basename()来处理Windows风格的路径(比如"C:\\my\\file.txt"),它会返回整个路径。

下面是一个在Linux主机上运行的交互式Python环境中的示例:

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'
1060

使用 os.path.splitos.path.basename 这些方法并不总是有效:如果你在Linux上运行脚本,试图处理经典的Windows路径,就会出问题。

Windows的路径可以使用反斜杠或正斜杠作为分隔符。因此,ntpath 模块(在Windows上相当于os.path)可以处理所有平台上的所有路径(1)

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

当然,如果文件名以斜杠结尾,basename会是空的,所以你需要自己写个函数来处理这个情况:

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文件名中很少使用反斜杠,但在编写代码时要记住这一点,以免造成意外的安全漏洞。

撰写回答