95 votes

Comment supprimer un préfixe de chemin en python ?

Je voulais savoir quelle est la fonction pythonic pour cela :

Je veux tout supprimer avant le chemin wa

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

Par exemple, je veux que '/book/html/wa/foo/bar/' devienne '/wa/foo/bar/' .

237voto

Mitch ミッチ Points 1933

Une meilleure réponse serait d'utiliser 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'

39voto

pjgranahan Points 175

Pour Python 3.4+, vous devez utiliser pathlib.PurePath.relative_to . À partir de la documentation :

 >>> 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'

Consultez également cette question StackOverflow pour plus de réponses à votre question.

27voto

Felix Loether Points 2505
>>> path = '/book/html/wa/foo/bar/'
>>> path[path.find('/wa'):]
'/wa/foo/bar/'

0voto

vivek Points 1333
import re

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X