java path 文件名,无论os / path格式是什么,都可以从路径中提取文件名
发布日期:2022-02-21 12:50:31 浏览次数:37 分类:技术文章

本文共 3983 字,大约阅读时间需要 13 分钟。

回答(14)

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

使用 os.path.split 或 os.path.basename 作为其他人建议赢得't work in all cases: if you'在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,而在Windows上,它总是引用文件夹的b子文件夹中的c文件 . 因此,当在路径中使用向前和向后斜杠时,您需要知道相关平台才能正确解释它 . 在实践中,通常可以安全地假设它是一个Windows路径,因为Linux文件名中很少使用反斜杠,但在编写代码时请记住这一点,这样就不会产生意外的安全漏洞 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

实际上,有一个function可以完全返回你想要的东西

print(os.path.basename(your_path))

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

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

>>> print(tail)

a.dat

>>> print(head)

/tmp/d

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

import os

head, tail = os.path.split(p)

print tail

假设p是输入字符串,tail就是你想要的 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

在python 3中

>>> from pathlib import Path

>>> Path("/tmp/d/a.dat").name

'a.dat'

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

在您的示例中,您还需要从右侧剥离斜杠以返回 c :

>>> import os

>>> path = 'a/b/c/'

>>> path = path.rstrip(os.sep) # strip the slash from the right side

>>> os.path.basename(path)

'c'

第二级:

>>> os.path.filename(os.path.dirname(path))

'b'

更新:我认为 lazyr 提供了正确的答案 . 我的代码不适用于unix系统上的类似Windows的路径,也不适用于Windows系统上的类似unix的路径 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

fname = str("C:\Windows\paint.exe").split('\\')[-1:][0]

这将返回: paint.exe

更改有关路径或操作系统的拆分功能的sep值 .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这适用于linux和windows以及标准库

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

def path_leaf(path):

return path.strip('/').strip('\\').split('/')[-1].split('\\')[-1]

[path_leaf(path) for path in paths]

结果:

['c', 'c', 'c', 'c', 'c', 'c', 'c']

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

我从未见过双背路径,它们是否存在? python模块 os 的内置功能失败了 . 所有其他人都在工作,也是你用 os.path.normpath() 给出的警告:

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', 'a/./b/c', 'a\b/c']

for path in paths:

os.path.basename(os.path.normpath(path))

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

Windows分隔符可以是Unix文件名或Windows路径 . Unix分隔符只能存在于Unix路径中 . Unix分隔符的存在表示非Windows路径 .

以下将通过OS特定分隔符剥离(剪切尾随分隔符),然后拆分并返回最右边的值 . 它很难看,但基于上面的假设很简单 . 如果假设不正确,请更新,我将更新此响应以匹配更准确的条件 .

a.rstrip("\\\\" if a.count("/") == 0 else '/').split("\\\\" if a.count("/") == 0 else '/')[-1]

示例代码:

b = ['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']

for a in b:

print (a, a.rstrip("\\" if a.count("/") == 0 else '/').split("\\" if a.count("/") == 0 else '/')[-1])

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

这是一个仅使用正则表达式的解决方案,它似乎适用于任何操作系统上的任何操作系统路径 .

不需要其他模块,也不需要预处理:

import re

def extract_basename(path):

"""Extracts basename of a given path. Should Work with any OS Path on any OS"""

basename = re.search(r'[^\\/]+(?=[\\/]?$)', path)

if basename:

return basename.group(0)

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

print([extract_basename(path) for path in paths])

# ['c', 'c', 'c', 'c', 'c', 'c', 'c']

extra_paths = ['C:\\', 'alone', '/a/space in filename', 'C:\\multi\nline']

print([extract_basename(path) for path in extra_paths])

# ['C:', 'alone', 'space in filename', 'multi\nline']

正则表达式可以测试here .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

也许只是我的所有在一个解决方案中没有重要的一些新的(关于创建临时文件的临时文件:D)

import tempfile

abc = tempfile.NamedTemporaryFile(dir='/tmp/')

abc.name

abc.name.replace("/", " ").split()[-1]

获取 abc.name 的值将是这样的字符串: '/tmp/tmpks5oksk7' 所以我可以用空格 .replace("/", " ") 替换 / 然后调用 split() . 这将返回一个列表,我用 [-1] 得到列表的最后一个元素

无需导入任何模块 .

最好的祝福

4k3nd0

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

为了完整起见,这里是python 3.2的 pathlib 解决方案:

>>> from pathlib import PureWindowsPath

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

>>> [PureWindowsPath(path).name for path in paths]

['c', 'c', 'c', 'c', 'c', 'c', 'c']

这适用于Windows和Linux .

e15298c6a3b4591803e154ab0c3b3e2e.png

2 years ago

filename = path[path.rfind('/')+1:]

转载地址:https://blog.csdn.net/weixin_33958381/article/details/115776113 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:c#l链接mysql,(visual studio)c#连接mysql数据库
下一篇:Java临时变量非常重要,JAVA学习之路(一)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月07日 13时31分13秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章