2009-07-14 5 views
1

lassen Sie uns sagen, dass ich Verzeichnispfade haben wie folgt aussehen:Frage zu Pfaden in 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 

In Python, wie kann ich diese Pfade aufgeteilt, so dass sie wie diese stattdessen aussehen:

a/include 
b/include 
a 
b 

wenn i os.path.split (Pfad) laufen [1] wird angezeigt:

include 
include 
a 
b 

Was soll ich hier versucht werden, sollte ich bei som suchen e Regex-Befehl oder kann dies ohne es getan werden? Danke im Voraus.

EDIT ALL: Ich löste es mit regulären Ausdrücken, verdammt handliches Werkzeug :)

+0

Es ist nicht klar, wie Sie bestimmen, wo den Pfad zu teilen. Zum Beispiel, was möchtest du mit etwas/anderem/basedir/und/stuff/das/I/include machen? –

+0

I/include und ich – Anders

Antwort

3

Vielleicht so etwas hängt wie fest einprogrammiert Ihr Präfix:

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

Verbrauch:

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

Angenommen, Sie befinden sich auf einer Plattform, wo das Verzeichnistrennzeichen (os.sep) wirklich der Schrägstrich ist).

Dieser Code versucht, Pfade als etwas mehr High-Level als nur Strings zu behandeln. Es ist jedoch nicht optimal, Sie könnten (oder sollten) mehr Reinigung und Kanonisierung durchführen, um sicherer zu sein.

1

was partition?
Es teilt die Zeichenfolge beim ersten Auftreten von sep und gibt ein 3-Tupel mit dem Teil vor dem Trennzeichen, dem Trennzeichen selbst und dem Teil nach dem Trennzeichen zurück. Wenn das Trennzeichen nicht gefunden wird, geben Sie ein 3-Tupel zurück, das die Zeichenfolge selbst enthält, gefolgt von zwei leeren Zeichenfolgen.

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 

für den neuen Kommentar von Autor Aktualisiert:
Es ist wie u durch brauchen rsplit für verschiedene Verzeichnisse sieht, ob das Verzeichnis endswith „include“ von nicht:

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

Vielleicht so etwas wie folgt aus:

result = [] 

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

Diese nur in 2.6 funktioniert. Der Relapath in 2.5 und davor funktioniert nur, wenn der Pfad das aktuelle Arbeitsverzeichnis ist.

0

Während das Kriterium nicht 100% klar ist, scheint aus dem OP-Kommentar, dass das Schlüsselthema speziell ist, ob die letzte Komponente des Pfads in "include" endet. Wenn dies der Fall ist, und um einen Fehler zu vermeiden, wenn die letzte Komponente z.B. "dontinclude" (wie eine andere Antwort, indem ich String Matching statt Pfadabgleich versuche), schlage ich vor:

def lastpart(apath): 
    pieces = os.path.split(apath) 
    final = -1 
    if pieces[-1] == 'include': 
     final = -2 
    return '/'.join(pieces[final:])