2012-01-01 3 views
29

Я хотел знать, что такое функция pythonic для этого:Как удалить префикс пути в Python?

Я хочу удалить все до пути wa.

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

Например, я хочу '/ книга/html/уа/Foo/бар /' стать '/ ва/Foo/бар /'

+6

Fyi при использовании путей лучше использовать функции split/join из модуля 'os.path' – ThiefMaster

ответ

22
>>> path = '/book/html/wa/foo/bar/' 
>>> path[path.find('/wa'):] 
'/wa/foo/bar/' 
+0

+1: по сравнению с использованием обычного выражения это проще и, вероятно, примерно так же быстро. – EOL

+2

Это возвращает последний символ, если строка не содержит '/ wa' (' путь [-1:] '), поэтому, если это может произойти, вы должны сначала проверить« if »/ wa» в пути » – dbr

+4

поочередно вы можете использовать 'str.index' вместо' str.find', чтобы создать исключение, когда игла не находится в стоге сена. – SingleNegationElimination

2
import re 

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

Это помогает для моего второго вопроса, который заключается в том, как удалить последний путь, если он является целым числом. Nice :) – Natim

98

Лучший ответ будет можно использовать 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' 
+6

Это гораздо лучший ответ, потому что он избегает любых проблем с разными разделителями путей. – intrepidhero

4

Для 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 для более ответов на ваш вопрос.

Смежные вопросы