2012-01-01 28 views
29

Tôi muốn biết hàm pythonic là gì:Làm cách nào để xóa tiền tố đường dẫn bằng Python?

Tôi muốn xóa mọi thứ trước đường wa.

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

Ví dụ, tôi muốn '/ cuốn sách/html/wa/foo/bar /' để trở thành '/ wa/foo/bar /'

+6

Fyi, khi xử lý đường dẫn tốt hơn, hãy sử dụng chức năng tách/nối từ mô-đun 'os.path' – ThiefMaster

Trả lời

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

+1: so với sử dụng cụm từ thông dụng, điều này đơn giản hơn và có thể nhanh hơn. – EOL

+2

Điều này trả về ký tự cuối cùng nếu chuỗi không chứa '/ wa' (' đường dẫn [-1:] '), vì vậy nếu điều đó có thể xảy ra, bạn muốn kiểm tra' if "/ wa" trong đường dẫn' trước tiên – dbr

+4

luân phiên, bạn có thể sử dụng 'str.index' thay vì' str.find' để tăng ngoại lệ khi kim không có trong haystack. – SingleNegationElimination

2
import re 

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

Điều này giúp cho câu hỏi thứ hai của tôi là cách xóa đường dẫn cuối cùng nếu nó là một số nguyên. Nice :) – Natim

98

Một câu trả lời tốt hơn sẽ được sử dụng 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

Đây là một câu trả lời tốt hơn nhiều vì nó tránh được bất kỳ vấn đề nào với các trình tách đường dẫn khác nhau. – intrepidhero

4

Đối với Python 3.4+, bạn nên sử dụng pathlib.PurePath.relative_to. Từ các tài liệu:

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

Xem thêm this StackOverflow question để biết thêm câu trả lời cho câu hỏi của bạn.

Các vấn đề liên quan