从路径中提取文件名,无论操作系统/路径格式如何
我可以用哪个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.split
或 os.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文件名中很少使用反斜杠,但在编写代码时要记住这一点,以免造成意外的安全漏洞。