微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从路径中提取文件名,无论 os/path 格式如何

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

解决方法

无论操作系统或路径格式是什么,我都可以使用哪个 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。