2009-07-14 3 views
1

скажем у меня есть пути каталогов, глядя, как это:Вопрос о пути в Python

this/is/the/basedir/path/a/include 
this/is/the/basedir/path/b/include 
this/is/the/basedir/path/a 
this/is/the/basedir/path/b 

В Python, как я могу разделить эти пути так, что они будут выглядеть, как это вместо:

a/include 
b/include 
a 
b 

Если я бегу os.path.split (путь) [1] будет отображаться:

include 
include 
a 
b 

Что я должен пытаться здесь, я должен смотреть на сома e regex или это можно сделать без него? Заранее спасибо.

EDIT ALL: Я решил его с помощью регулярных выражений, проклятый удобный инструмент :)

+0

Непонятно, как вы определяете, где разделить путь. Например, что бы вы хотели сделать с некоторыми/другими/basedir/и/stuff/that/I/include? –

+0

I/include и I – Anders

ответ

3

Возможно, что-то вроде этого, зависит о том, как жёстко ваш префикс:

def removePrefix(path, prefix): 
    plist = path.split(os.sep) 
    pflist = prefix.split(os.sep) 
    rest = plist[len(pflist):] 
    return os.path.join(*rest) 

Использование:

print removePrefix("this/is/the/basedir/path/b/include", "this/is/the/basedir/path") 
b/include 

Предполагая, что вы находитесь на платформе, где разделитель каталогов (os.sep) действительно является косой чертой).

Этот код пытается обрабатывать пути как нечто более высокоуровневое, чем простые строки. Это не оптимально, но вы могли бы (или должны) делать большую очистку и канонизацию, чтобы быть более безопасными.

1

, что о partition?
Он разделяет строку при первом вводе sep и возвращает 3-кортеж, содержащий деталь перед разделителем, сам разделитель и часть после разделителя. Если разделитель не найден, верните 3-кортеж, содержащий строку, а затем две пустые строки.

data = """this/is/the/basedir/path/a/include 
this/is/the/basedir/path/b/include 
this/is/the/basedir/path/a 
this/is/the/basedir/path/b""" 
for line in data.splitlines(): 
    print line.partition("this/is/the/basedir/path/")[2] 

#output 
a/include 
b/include 
a 
b 

Обновлено для нового комментария по автору:
Похоже, и нужно rsplit для различных каталогов с помощью ли «включать» каталог EndsWith из: не

import os.path 
data = """this/is/the/basedir/path/a/include 
this/is/the/basedir/path/b/include 
this/is/the/basedir/path/a 
this/is/the/basedir/path/b""" 
for line in data.splitlines(): 
    if line.endswith('include'): 
     print '/'.join(line.rsplit("/",2)[-2:]) 
    else: 
     print os.path.split(line)[1] 
     #or just 
     # print line.rsplit("/",1)[-1] 
#output 
a/include 
b/include 
a 
b 
1

Может быть что-то вроде этого:

result = [] 

prefix = os.path.commonprefix(list_of_paths) 
for path in list_of_paths: 
    result.append(os.path.relpath(path, prefix)) 

Это работает только в 2.6. Релапат в 2.5 и до этого работает только в том случае, если путь является текущим рабочим каталогом.

0

В то время как критерий не является на 100% понятным, кажется, что из комментария OP следует, что ключевой вопрос заключается в том, заканчивается ли последний компонент пути «включить». Если это так, и чтобы избежать ошибок, когда последний компонент, например. «dontinclude» (как еще один ответ получается путем проверки соответствия строк вместо соответствия пути), я предлагаю:

def lastpart(apath): 
    pieces = os.path.split(apath) 
    final = -1 
    if pieces[-1] == 'include': 
     final = -2 
    return '/'.join(pieces[final:]) 
Смежные вопросы