如何在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中删除路径前缀?的主要内容,如果未能解决你的问题,请参考以下文章
Redis Python - 如何在python中根据特定模式删除所有键,无需python迭代