如何在python中删除路径前缀?

Posted

技术标签:

【中文标题】如何在python中删除路径前缀?【英文标题】:How to remove a path prefix in python? 【发布时间】:2012-01-31 08:33:50 【问题描述】:

我想知道这个的pythonic函数是什么:

我想删除wa 路径之前的所有内容。

p = path.split('/')
counter = 0
while True:
    if p[counter] == 'wa':
        break
    counter += 1
path = '/'+'/'.join(p[counter:])

例如,我希望 '/book/html/wa/foo/bar/' 变成 '/wa/foo/bar/'

【问题讨论】:

仅供参考,在处理路径时,最好使用os.path 模块中的拆分/连接功能 【参考方案1】:

更好的答案是使用 os.path.relpath:

http://docs.python.org/3/library/os.path.html#os.path.relpath

>>> import os
>>> full_path = '/book/html/wa/foo/bar/'
>>> relative_path = '/book/html'
>>> print(os.path.relpath(full_path, relative_path))
'wa/foo/bar'

【讨论】:

这是一个更好的答案,因为它避免了不同路径分隔符的任何问题。 完全同意@intrepidhero 的评论,而且无论full_path 是否包含结尾的/ 字符,它都有效——所以它比这更笼统。【参考方案2】:
>>> path = '/book/html/wa/foo/bar/'
>>> path[path.find('/wa'):]
'/wa/foo/bar/'

【讨论】:

+1:与使用正则表达式相比,这更简单,而且速度可能差不多。 如果字符串不包含/wa (path[-1:]),则返回最后一个字符,因此如果可能发生这种情况,您需要先检查if "/wa" in path 或者,您可以使用str.index 而不是str.find 在针不在大海捞针时引发异常。 这不适用于多个同名文件夹。【参考方案3】:

对于 Python 3.4+,您应该使用 pathlib.PurePath.relative_to。 来自文档:

>>> p = PurePosixPath('/etc/passwd')
>>> p.relative_to('/')
PurePosixPath('etc/passwd')

>>> p.relative_to('/etc')
PurePosixPath('passwd')

>>> p.relative_to('/usr')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "pathlib.py", line 694, in relative_to
    .format(str(self), str(formatted)))
ValueError: '/etc/passwd' does not start with '/usr'

另请参阅this *** question 以获取有关您问题的更多答案。

【讨论】:

虽然pathlib 模块非常“用户友好”,但它直到游戏后期才创建。就我个人而言,我仍然更喜欢使用os.path.relpath(),如accepted answer 所示,因为它适用于大多数Python 版本(包括Python 2)。【参考方案4】:
import re

path = '/book/html/wa/foo/bar/'
m = re.match(r'.*(/wa/[a-z/]+)',path)
print m.group(1)

【讨论】:

这有助于我的第二个问题,即如果最后一个路径是整数,如何删除它。不错:)

以上是关于如何在python中删除路径前缀?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 Python 中的错误路径字符?

Redis Python - 如何在python中根据特定模式删除所有键,无需python迭代

Google Cloud Storage:如何在 Python 中(递归)删除文件夹

禁用 RPC 时如何在远程服务器上删除具有多个前缀的永久表

如何从 Flyway 迁移名称中删除前缀?

如何删除jquery id中的前缀