2008-10-08 6 views
5

Ich liebe Python, weil es Batterien enthalten, und ich benutze eingebaute Funktionen, viel, um die schmutzige Arbeit für mich zu tun.Os.path: Können Sie dieses Verhalten erklären?

Ich habe schon immer gerne die os.path Modul mit Dateipfad umgehen, aber vor kurzem beenden ich mit unerwarteten Ergebnissen auf Python 2.5 unter Ubuntu Linux, während mit Zeichenfolge handelt, die Windows-Dateipfade repräsentieren:

filepath = r"c:\ttemp\FILEPA~1.EXE" 
print os.path.basename(filepath) 
'c:\\ttemp\\FILEPA~1.EXE'] 
print os.path.splitdrive(filepath) 
('', 'c:\ttemp\\FILEPA~1.EXE') 

WTF?

Es endet auf die gleiche Weise mit Dateipfad = u "c: \ ttemp \ FILEPA ~ 1.EXE" und filepath = "c: \ ttemp \ FILEPA ~ 1.EXE".

Haben Sie eine Ahnung? Ubuntu benutzt UTF8, aber ich habe nicht das Gefühl, dass es etwas damit zu tun hat. Vielleicht ist meine Python-Installation durcheinander, aber ich habe keine spezielle Optimierung vorgenommen, an die ich mich erinnern kann.

+0

Vielleicht möchten Sie Ihre akzeptierte Antwort überprüfen - siehe Moes Verweis auf ntpath, was der richtige Weg ist, dies zu tun. –

Antwort

24

Wenn Sie Windows-Pfade auf Linux manipulieren Sie die ntpath Modul verwendet werden soll (dies ist das Modul, das als os.path auf Windows importiert wird - posixpath als os.path auf Linux importiert wird)

>>> import ntpath 
>>> filepath = r"c:\ttemp\FILEPA~1.EXE" 
>>> print ntpath.basename(filepath) 
FILEPA~1.EXE 
>>> print ntpath.splitdrive(filepath) 
('c:', '\\ttemp\\FILEPA~1.EXE') 
+2

Dies ist eine ausgezeichnete Antwort, die es verdient, die akzeptierte sein, IMHO.Es ist viel besser, vorgefertigte Werkzeuge zu verwenden, als eigene Regexs herzustellen. –

+1

+1 für ntpath; das ist das Richtige zu tun – efotinis

+0

Mein Freund, das ist brillant! –

3

Aus os.path Dokumentation:

os.path.splitdrive (Pfad)
Split der Pfadname Pfad in ein Paar (Antrieb, Schwanz), in dem Laufwerk ist entweder ein Laufwerk Spezifikation oder die leere Zeichenkette. Auf Systemen, die keine Laufwerksspezifikationen verwenden, ist Laufwerk immer die leere Zeichenfolge. In allen Fällen entspricht Laufwerk + Ende dem Pfad.

Wenn Sie dies auf Unix ausführen, verwendet es nicht Laufwerkspezifikationen, daher - Laufwerk wird leere Zeichenfolge sein.

Wenn Sie auf jeder Plattform Windows-Pfade lösen möchten, können Sie nur eine einfache Regexp verwenden:

import re 
(drive, tail) = re.compile('([a-zA-Z]\:){0,1}(.*)').match(filepath).groups() 

drive wird durch : einen Laufwerksbuchstaben gefolgt sein (zB c:, u:.) Oder None und tail der ganze Rest :)

+0

Ja, merkt euch einfach: Der String-Prozess basiert auf dem Betriebssystem, nicht auf Syntax. Es macht keinen Unterschied zwischen Gewinn und Unix-Pfad, es wendet nur einen anderen Algo entsprechend Ihrer Plattform an. Mist. –

+0

Verwenden Sie keine regulären Ausdrücke, verwenden Sie stattdessen das ntpath-Modul - siehe meine Antwort. – Moe

+0

Nichts für ungut kender, er hat recht :-) –

1

finden Sie in die Dokumentation here, speziell:

splitdrive (p) Teilen Sie einen Pfadnamen in Laufwerk und Pfad. In Posix ist das Laufwerk immer leer.

Das wird also nicht auf einer Linux-Box funktionieren.

Verwandte Themen