java path 文件名,无论os / path格式是什么,都可以从路径中提取文件名

回答(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:]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值