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

Nat*_*tim 53 python string path prefix

我想知道什么是pythonic函数:

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

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

例如,我想'/book/html/wa/foo/bar/'成为'/wa/foo/bar/'.

Mit*_*ミッチ 142

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

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

>>> import os
>>> full_path = '/book/html/wa/foo/bar/'
>>> print os.path.relpath(full_path, '/book/html')
'wa/foo/bar'
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的答案,因为它避免了不同路径分隔符的任何问题. (7认同)

Fel*_*her 21

>>> path = '/book/html/wa/foo/bar/'
>>> path[path.find('/wa'):]
'/wa/foo/bar/'
Run Code Online (Sandbox Code Playgroud)

  • 或者,当针不在大海捞针中时,您可以使用`str.index`而不是`str.find`来引发异常. (4认同)
  • 如果字符串不包含`/ wa`(`path [-1:]`),则返回最后一个字符,所以如果发生这种情况,你首先要检查路径`中的`if"/ wa" (2认同)
  • 这不适用于多个同名文件夹。 (2认同)

pjg*_*han 8

对于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'
Run Code Online (Sandbox Code Playgroud)

另请参阅此StackOverflow问题以获取更多问题的答案.