【问题标题】:How to remove a path prefix in python?如何在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 模块中的拆分/连接功能

标签: python string path prefix


【解决方案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 StackOverflow 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)

【讨论】:

  • 这有助于我的第二个问题,即如果最后一个路径是整数,如何删除它。不错:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 2015-08-12
  • 2016-01-18
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多