So teilen Sie einen Dos-Pfad in Python in seine Komponenten auf

152

Ich habe eine String-Variable, die einen Dos-Pfad darstellt, z.

var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Ich möchte diesen String aufteilen in:

[ "d", "stuff", "morestuff", "furtherdown", "THEFILE.txt" ]

Ich habe es versucht split()und replace()aber sie verarbeiten entweder nur den ersten Backslash oder sie fügen Hex-Zahlen in die Zeichenfolge ein.

Ich muss diese Zeichenfolgenvariable irgendwie in eine Rohzeichenfolge konvertieren, damit ich sie analysieren kann.

Was ist der beste Weg, dies zu tun?

Ich sollte auch hinzufügen, dass der Inhalt des varPfads, den ich zu analysieren versuche, tatsächlich der Rückgabewert einer Befehlszeilenabfrage ist. Es sind keine Pfaddaten, die ich selbst generiere. Es ist in einer Datei gespeichert, und das Befehlszeilentool wird den Backslashes nicht entkommen.

BeeBand
quelle
6
Denken Sie beim Überprüfen dieser Antworten daran, dass os.path.splitdies bei Ihnen nicht funktioniert, da Sie dieser Zeichenfolge nicht ordnungsgemäß entkommen.
Jed Smith
Sie müssen der Zeichenfolge entkommen oder Rawstring verwenden r"d:\stuff\morestuff\furtherdown\THEFILE.txt", um \sFehlinterpretationen zu vermeiden .
smci

Antworten:

163

Ich bin viele Male von Leuten gebissen worden, die ihre eigenen Pfadfummelfunktionen geschrieben haben und es falsch verstanden haben. Leerzeichen, Schrägstriche, Backslashes, Doppelpunkte - die Möglichkeiten für Verwirrung sind nicht endlos, aber Fehler können trotzdem leicht gemacht werden. Also bin ich ein Stickler für die Verwendung von os.pathund empfehle es auf dieser Basis.

(Der Weg zur Tugend ist jedoch nicht der leichteste, und viele Menschen, die dies finden, sind versucht, einen rutschigen Weg direkt zur Verdammnis zu gehen. Sie werden erst eines Tages erkennen, dass alles in Stücke fällt, und sie - oder Wahrscheinlich muss jemand anderes herausfinden, warum alles schief gelaufen ist, und es stellt sich heraus, dass jemand einen Dateinamen erstellt hat, der Schrägstriche und Backslashes mischt. Eine Person schlägt vor, dass die Antwort "das nicht tun" lautet. Don ' Ich bin keiner dieser Leute. Außer dem, der Schrägstriche und Backslashes verwechselt hat - du könntest sie sein, wenn du willst.)

Sie können das Laufwerk und die Pfad + Datei wie folgt abrufen:

drive, path_and_file = os.path.splitdrive(path)

Holen Sie sich den Pfad und die Datei:

path, file = os.path.split(path_and_file)

Das Abrufen der einzelnen Ordnernamen ist nicht besonders praktisch, aber es ist die Art von ehrlichem, mittelmäßigem Unbehagen, die das Vergnügen erhöht, später etwas zu finden, das tatsächlich gut funktioniert:

folders = []
while 1:
    path, folder = os.path.split(path)

    if folder != "":
        folders.append(folder)
    else:
        if path != "":
            folders.append(path)

        break

folders.reverse()

(Dies erscheint "\"am Anfang, folderswenn der Pfad ursprünglich absolut war. Sie könnten ein bisschen Code verlieren, wenn Sie das nicht wollten.)

HunnyBear
quelle
@brone - Ich bevorzuge die Verwendung dieser Lösung, anstatt mir Sorgen machen zu müssen, dass der Backslash vermieden wird. Vielen Dank!
BeeBand
1
Ich würde mich freuen, wenn ich mich als falsch erweisen würde, aber es scheint mir, dass die vorgeschlagene Lösung nicht funktioniert, wenn ein Pfad wie dieser "C: \ usr \ rs0 \ my0 \ in111102.log" verwendet wird (es sei denn, die anfängliche Eingabe ist eine Rohzeichenfolge )?
Shearichard
1
Es sieht so aus, als würde dies einen Pfad nicht richtig aufteilen, wenn er nur ein Verzeichnis in OSX wie "/ path / to / my / folder /" enthält, um zu erreichen, dass Sie diese beiden Zeilen am Anfang hinzufügen möchten: if path.endswith("/"):und path = path[:-1].
Kevin London
1
Ich bevorzuge Lösung von @Tompa
Jaycode
1
Ich stimme mit jaycode : Tompa ‚s Lösung ist der kanonische Ansatz und soll die akzeptierte Antwort gewesen. Diese übermäßig komplexe, ineffiziente und fehleranfällige Alternative kann den Produktionscode nicht weitergeben. Es gibt keinen vernünftigen Grund, zu versuchen (... und natürlich zu scheitern), Pfadnamen iterativ zu analysieren, wenn die einfache Aufteilung von Zeichenfolgen mit nur einer einzigen Codezeile erfolgreich ist.
Cecil Curry
287

Ich würde es tun

import os
path = os.path.normpath(path)
path.split(os.sep)

Normalisieren Sie zuerst die Pfadzeichenfolge in eine geeignete Zeichenfolge für das Betriebssystem. Dann os.sepmuss es sicher sein, als Trennzeichen bei der Aufteilung von Zeichenfolgenfunktionen verwendet zu werden.

Tompa
quelle
25
Die einzig wahre Antwort: Es ist aufgetaucht . Die kanonische Lösung ist natürlich die einfachste. Erblicken! Denn es ist elegant und kontrovers und hat keine unerträglichen Randfälle.
Cecil Curry
20
Als Einzeileros.path.normpath(a_path).split(os.path.sep)
Daniel Farrell
2
Dies scheint für path = root nicht zu funktionieren. In diesem Fall ist das Ergebnis von path.split ['', '']. Tatsächlich gibt diese split () -Lösung im Allgemeinen ein Verzeichnis ganz links mit einem Namen für leere Zeichenfolgen an (der durch den entsprechenden Schrägstrich ersetzt werden könnte). Das Hauptproblem besteht darin, dass ein einzelner Schrägstrich (je nach Betriebssystem vorwärts oder rückwärts) der Name des Stammverzeichnisses ist, während er an anderer Stelle im Pfad ein Trennzeichen ist .
Gwideman
2
Funktioniert es dann besser mit einem Streifen? os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
Vidar
1
@ user60561 Das liegt daran, dass Backslash unter Linux ein zulässiges Zeichen in Dateinamen ist, während dies unter Windows kein Schrägstrich ist. Aus diesem Grund wird unter Windows ein normpathSchrägstrich als Trennzeichen erkannt. Unter Linux normpathwird einfach davon ausgegangen, dass Sie ein Verzeichnis namens \1\2und eine Datei oder ein Verzeichnis darin aufgerufen haben 3.
Vojislav Stojkovic
80

Sie können einfach den pythonischsten Ansatz (IMHO) verwenden:

import os

your_path = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
path_list = your_path.split(os.sep)
print path_list

Welches wird Ihnen geben:

['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Der Hinweis hier ist, os.sepanstelle von '\\'oder zu verwenden '/', da dies das System unabhängig macht.

Um den Doppelpunkt aus dem Laufwerksbuchstaben zu entfernen (obwohl ich keinen Grund sehe, warum Sie das tun möchten), können Sie schreiben:

path_list[0] = path_list[0][0]
Maciek D.
quelle
22
Das funktioniert some times. In anderen Fällen (zumindest unter Windows) finden Sie Pfade, die aussehen folder\folder2\folder3/file.txt. Es ist besser, zuerst den Pfad zu normalisieren (os.path.normpath) und diesen dann aufzuteilen.
Vikki
7
Diese Antwort war fast da. Wie Vikki vorschlägt, ist das Versagen, Pfadnamen vor dem Aufteilen von Zeichenfolgen zu normalisieren, in alltäglichen Randfällen (z /foo//bar. B. ) zum Scheitern verurteilt . Siehe Tompa ‚s Antwort für eine robustere Lösung.
Cecil Curry
62

In Python> = 3.4 ist dies viel einfacher geworden. Sie können jetzt pathlib.Path.partsalle Teile eines Pfads abrufen.

Beispiel:

>>> from pathlib import Path
>>> Path('C:/path/to/file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> Path(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')

Bei einer Windows-Installation von Python 3 wird davon ausgegangen, dass Sie mit Windows-Pfaden arbeiten, und bei * nix wird davon ausgegangen, dass Sie mit Posix-Pfaden arbeiten. Dies ist normalerweise das, was Sie wollen, aber wenn dies nicht der Fall ist, können Sie die Klassen verwenden pathlib.PurePosixPathoder pathlib.PureWindowsPathnach Bedarf:

>>> from pathlib import PurePosixPath, PureWindowsPath
>>> PurePosixPath('/path/to/file.txt').parts
('/', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'C:\path\to\file.txt').parts
('C:\\', 'path', 'to', 'file.txt')
>>> PureWindowsPath(r'\\host\share\path\to\file.txt').parts
('\\\\host\\share\\', 'path', 'to', 'file.txt')

Bearbeiten: Es gibt auch einen Backport zu Python 2: pathlib2

freidrichen
quelle
3
Path.parts ist das, was ich immer wollte, aber ich habe bis heute nie gewusst, dass es existiert.
JamEnergy
Warum wurde dies nicht um eine nette native Python-Funktion gewickelt?
Eduardo Pignatelli
2
DAS ist die Antwort!
Nayriz
11

Das Problem beginnt hier zunächst damit, wie Sie die Zeichenfolge erstellen.

a = "d:\stuff\morestuff\furtherdown\THEFILE.txt"

Geschah diese Weise wird versucht , Python zu speziellem Fall dieser: \s, \m, \f, und \T. In Ihrem Fall \fwird es als Formfeed (0x0C) behandelt, während die anderen Backslashes korrekt behandelt werden. Was Sie tun müssen, ist eine der folgenden:

b = "d:\\stuff\\morestuff\\furtherdown\\THEFILE.txt"      # doubled backslashes
c = r"d:\stuff\morestuff\furtherdown\THEFILE.txt"         # raw string, no doubling necessary

Sobald Sie eine dieser Optionen aufgeteilt haben, erhalten Sie das gewünschte Ergebnis.

Craig Trader
quelle
@W. Craig Trader - danke, aber dieser Pfad ist nicht einer, den ich selbst generiere - er kommt von einem anderen Programm zu mir zurück und ich muss diese Daten in einer Variablen speichern. Ich bin nicht sicher, wie ich in einer Variablen gespeicherte Daten in "Rohtext" konvertieren soll.
BeeBand
Es gibt keinen "Rohtext" ... es ist nur so, wie Sie ihn in der Quelle darstellen. Stellen Sie der Zeichenfolge entweder r "" voran oder führen Sie sie durch .replace ('\\', '/')
Marco Mariani
@BeeBand, wie erhalten Sie die Daten vom anderen Programm zurück? Lesen Sie es aus einer Datei, einer Pipe, einem Socket? Wenn ja, dann müssen Sie nichts Besonderes tun. Der einzige Grund für das Verdoppeln von Backslashes oder die Verwendung von rohen Zeichenfolgen besteht darin, Zeichenfolgenkonstanten in Python-Code einzufügen. Wenn das andere Programm jedoch doppelte Backslashes generiert, sollten Sie diese bereinigen, bevor Sie Ihren Pfad aufteilen.
Craig Trader
@W. Craig Trader - ich lese es aus einer Datei, die von einem anderen Programm geschrieben wird. Ich konnte aus irgendeinem Grund nicht arbeiten split()oder replace()arbeiten - ich bekam immer wieder Hex-Werte. Sie haben jedoch Recht, ich glaube, ich habe mit der Idee der rohen Schnur den falschen Baum angebellt - ich glaube, ich habe nur split()falsch verwendet. Weil ich einige dieser Lösungen ausprobiert habe split()und sie jetzt für mich funktionieren.
BeeBand
10

Beachten Sie für eine etwas präzisere Lösung Folgendes:

def split_path(p):
    a,b = os.path.split(p)
    return (split_path(a) if len(a) and len(b) else []) + [b]
user1556435
quelle
Dies ist meine Lieblingslösung für dieses Problem. Sehr schön.
Will Moore
1
Dies funktioniert nicht, wenn der Pfad mit endet /. Außerdem erhalten Sie eine leere Zeichenfolge am Anfang der Liste, wenn Ihr Pfad mit/
Sorig
4

Ich kann keine wirkliche Antwort auf diese Frage geben (da ich hierher gekommen bin, um selbst eine zu finden), aber für mich ist die Anzahl der unterschiedlichen Ansätze und alle genannten Vorbehalte der sicherste Indikator dafür, dass Pythons os.path-Modul dies dringend benötigt als eingebaute Funktion.

antred
quelle
4

Der funktionale Weg mit einem Generator .

def split(path):
    (drive, head) = os.path.splitdrive(path)
    while (head != os.sep):
        (head, tail) = os.path.split(head)
        yield tail

In Aktion:

>>> print([x for x in split(os.path.normpath('/path/to/filename'))])
['filename', 'to', 'path']
Benoit
quelle
3

Für mich geht das:

>>> a=r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
>>> a.split("\\")
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Sicher, Sie müssen möglicherweise auch den Doppelpunkt aus der ersten Komponente entfernen, aber wenn Sie ihn beibehalten, können Sie den Pfad wieder zusammensetzen.

Der rModifikator markiert das Zeichenfolgenliteral als "raw". Beachten Sie, dass eingebettete Backslashes nicht verdoppelt werden.

entspannen
quelle
@unwind - das rvor deinem String, worauf bezieht sich das?
BeeBand
2
r bedeutet rohe Zeichenfolge - es werden automatisch \ Zeichen maskiert . Es ist nützlich, wenn Sie Pfade ausführen.
Wayne Werner
1
@BeeBand: Sie müssen sich nicht darum kümmern; Das r "" ist nur etwas, das beim Kompilieren / Parsen des Codes wichtig ist. Es wird nicht zu einer Eigenschaft der Zeichenfolge, sobald es analysiert wurde. Es bedeutet nur "hier ist ein String-Literal, aber interpretieren Sie keine Backslashes als eine andere Bedeutung als Backslashes".
Entspannen Sie
3
Ich denke, es könnte hilfreich sein, Sie zu erwähnen, aber tun Sie es mehrdeutig, wenn Sie a.split (os.sep) verwenden, anstatt es hart zu codieren?
Tim McJilton
4
Ich muss Sie dafür herabstimmen, dass Sie keine Gelegenheit zur Erklärung verpasst haben os.path.splitund os.pathsepdass beide weitaus tragbarer sind als das, was Sie geschrieben haben. Für OP ist es jetzt vielleicht nicht wichtig, aber es wird, wenn er etwas schreibt, das Plattformen bewegen muss.
Jed Smith
3

Das Zeug über ungefähr mypath.split("\\")würde besser ausgedrückt werden als mypath.split(os.sep). sepist das Pfadtrennzeichen für Ihre bestimmte Plattform (z. B. \für Windows, /Unix usw.), und der Python-Build weiß, welches verwendet werden soll. Wenn Sie verwenden sep, ist Ihr Code plattformunabhängig.

Chris
quelle
1
Oder os.path.split. Sie möchten vorsichtig sein os.pathsep, da es sich :um meine Python-Version in OS X handelt (und os.path.splitordnungsgemäß verarbeitet wird /).
Jed Smith
4
Du meinst os.sepnicht os.pathsep. Befolgen Sie die Anweisungen in den os.sepDokumenten: Beachten Sie, dass es nicht ausreicht, dies zu wissen, um Pfadnamen analysieren oder verketten zu können. Verwenden Sie os.path.split () und os.path.join ().
Jon-Eric
1

re.split () kann etwas mehr helfen als string.split ()

import re    
var = "d:\stuff\morestuff\furtherdown\THEFILE.txt"
re.split( r'[\\/]', var )
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Wenn Sie auch Linux- und Mac-Pfade unterstützen möchten, fügen Sie einfach einen Filter hinzu (Keine, Ergebnis), damit das unerwünschte '' aus dem split () entfernt wird, da deren Pfade mit '/' oder '//' beginnen. Zum Beispiel '// mount / ...' oder '/ var / tmp /'

import re    
var = "/var/stuff/morestuff/furtherdown/THEFILE.txt"
result = re.split( r'[\\/]', var )
filter( None, result )
['var', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
Asi
quelle
1

Sie können os.path.splitdie Zeichenfolge rekursiv ausführen

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [p]

Testen Sie dies anhand einiger Pfadzeichenfolgen und setzen Sie den Pfad mit neu zusammen os.path.join

>>> for path in [
...         r'd:\stuff\morestuff\furtherdown\THEFILE.txt',
...         '/path/to/file.txt',
...         'relative/path/to/file.txt',
...         r'C:\path\to\file.txt',
...         r'\\host\share\path\to\file.txt',
...     ]:
...     print parts(path), os.path.join(*parts(path))
... 
['d:\\', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt'] d:\stuff\morestuff\furtherdown\THEFILE.txt
['/', 'path', 'to', 'file.txt'] /path\to\file.txt
['', 'relative', 'path', 'to', 'file.txt'] relative\path\to\file.txt
['C:\\', 'path', 'to', 'file.txt'] C:\path\to\file.txt
['\\\\', 'host', 'share', 'path', 'to', 'file.txt'] \\host\share\path\to\file.txt

Das erste Element der Liste muss möglicherweise unterschiedlich behandelt werden, je nachdem, wie Sie mit Laufwerksbuchstaben, UNC-Pfaden sowie absoluten und relativen Pfaden umgehen möchten. Ändern des letzten [p]zu [os.path.splitdrive(p)]Kräften den Laufwerksbuchstaben und Verzeichnis Wurzel aus in ein Tupel , das Problem durch die Spaltung.

import os
def parts(path):
    p,f = os.path.split(path)
    return parts(p) + [f] if f else [os.path.splitdrive(p)]

[('d:', '\\'), 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
[('', '/'), 'path', 'to', 'file.txt']
[('', ''), 'relative', 'path', 'to', 'file.txt']
[('C:', '\\'), 'path', 'to', 'file.txt']
[('', '\\\\'), 'host', 'share', 'path', 'to', 'file.txt']

Bearbeiten: Ich habe festgestellt, dass diese Antwort der oben von user1556435 angegebenen sehr ähnlich ist . Ich lasse meine Antwort offen, da die Behandlung der Laufwerkskomponente des Pfads unterschiedlich ist.

Mike Robins
quelle
0

Genau wie andere erklärt haben - Ihr Problem ergab sich aus der Verwendung von \Escape-Zeichen in Zeichenfolgenliteral / -konstante. OTOH, wenn Sie diese Dateipfadzeichenfolge von einer anderen Quelle hätten (aus Datei, Konsole gelesen oder von der OS-Funktion zurückgegeben), hätte es keine Probleme bei der Aufteilung auf '\\' oder r '\' gegeben.

Und genau wie andere vorgeschlagen, wenn Sie verwenden möchten , \in Programm wörtlichen, müssen Sie entweder zu duplizieren \\oder das gesamte wörtliche hat durch vorangestellt werden r, wie so r'lite\ral'oder r"lite\ral"den Parser zu vermeiden , die Umwandlung dieser \und rCR (Carriage Return).

Es gibt jedoch noch einen weiteren Weg - verwenden Sie \in Ihrem Code nur keine Backslash- Pfadnamen! Seit dem letzten Jahrhundert erkennt und funktioniert Windows gut mit Pfadnamen, die Schrägstriche als Verzeichnistrennzeichen verwenden /! Irgendwie wissen das nicht viele Leute .. aber es funktioniert:

>>> var = "d:/stuff/morestuff/furtherdown/THEFILE.txt"
>>> var.split('/')
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']

Dadurch funktioniert Ihr Code übrigens unter Unix, Windows und Mac ... da alle /als Verzeichnistrennzeichen verwendet werden ... auch wenn Sie die vordefinierten Konstanten des Moduls nicht verwenden möchten os.

Nas Banov
quelle
Leider werden die Daten von einem anderen Programm an mich zurückgegeben, das ich über mein Python-Skript ausführe. Ich habe keine Kontrolle darüber, ob ich '\' oder '/' verwenden soll - es ist das Programm eines Drittanbieters, das dies bestimmt (wahrscheinlich auf Plattformbasis).
BeeBand
@BeeBand: Ah, dann haben Sie nicht das Problem, das Sie beim Testen hatten, als Sie die Zeichenfolge als Literal in Ihrem Programm angegeben haben. Oder Sie können den folgenden bösen Hack var = var.replace('\\','/')
ausführen,
das ist in der Tat ein böser Hack: o)
BeeBand
@BeeBand: Deshalb habe ich gewarnt. Wenn ich sage, dass etwas böse ist, meine ich nicht unbedingt, dass es niemals benutzt werden sollte - aber man sollte sich sehr bewusst sein, warum sie es benutzen und auf unbeabsichtigte Konsequenzen aufmerksam machen. In diesem Fall ist eine sehr unwahrscheinliche Konsequenz, dass, wenn dies auf einem Unix-Dateisystem mit `` Verwendung in Datei- oder Verzeichnisnamen verwendet wird (es ist wirklich schwer, aber möglich) - dieser Code 'kaputt geht'
Nas Banov
0

Angenommen, Sie haben eine Datei filedata.txtmit Inhalten:

d:\stuff\morestuff\furtherdown\THEFILE.txt
d:\otherstuff\something\otherfile.txt

Sie können die Dateipfade lesen und teilen:

>>> for i in open("filedata.txt").readlines():
...     print i.strip().split("\\")
... 
['d:', 'stuff', 'morestuff', 'furtherdown', 'THEFILE.txt']
['d:', 'otherstuff', 'something', 'otherfile.txt']
zoli2k
quelle
das funktioniert ja, danke! Aber ich habe mich für die Lösung von Brone entschieden, weil ich mir lieber keine Sorgen darüber mache, dem Backslash zu entkommen.
BeeBand
9
Nicht pythonisch, da es vom Dateisystem abhängig ist.
jb.
0

Ich verwende Folgendes, da es die Funktion os.path.basename verwendet und der zurückgegebenen Liste keine Schrägstriche hinzufügt. Es funktioniert auch mit Schrägstrichen jeder Plattform: dh Windows \\ oder Unix /. Außerdem wird nicht das \\\\ hinzugefügt, das Windows für Serverpfade verwendet :)

def SplitPath( split_path ):
    pathSplit_lst   = []
    while os.path.basename(split_path):
        pathSplit_lst.append( os.path.basename(split_path) )
        split_path = os.path.dirname(split_path)
    pathSplit_lst.reverse()
    return pathSplit_lst

Also für '\\\\ Server \\ Ordner1 \\ Ordner2 \\ Ordner3 \\ Ordner4'

du erhältst

['Server', 'Ordner1', 'Ordner2', 'Ordner3', 'Ordner4']

Jay
quelle
1
Dies folgt nicht der Invariante, an die die Übergabe Ihres Ergebnisses an os.path.join()die ursprüngliche Zeichenfolge zurückgegeben werden soll. Ich würde sagen, die richtige Ausgabe für Ihre Beispieleingabe ist [r'\\','server','folder1','folder2','folder3','folder4']. Dh was os.path.split()macht.
Jon-Eric
0

Ich bin mir nicht sicher, ob dies die Frage vollständig beantwortet, aber es hat mir Spaß gemacht, diese kleine Funktion zu schreiben, die einen Stapel behält, sich an os.path-basierte Manipulationen hält und die Liste / den Stapel von Elementen zurückgibt.

  9 def components(path):
 10     ret = []
 11     while len(path) > 0:
 12         path, crust = split(path)
 13         ret.insert(0, crust)
 14
 15     return ret
 16
Mallyvai
quelle
0

Die folgende Codezeile kann Folgendes verarbeiten:

  1. C: / Pfad / Pfad
  2. C: // Pfad // Pfad
  3. C: \ Pfad \ Pfad
  4. C: \ Pfad \ Pfad

path = re.split (r '[/// \]', path)

Gour Bera
quelle
0

Eine rekursive für den Spaß.

Nicht die eleganteste Antwort, sollte aber überall funktionieren:

import os

def split_path(path):
    head = os.path.dirname(path)
    tail = os.path.basename(path)
    if head == os.path.dirname(head):
        return [tail]
    return split_path(head) + [tail]
DuGNu
quelle
in der Tat, sorry. Hätte die Frage sorgfältig lesen sollen ... einen "Dos" -Pfad.
DuGNu
-1

verwenden ntpath.split()

deft_code
quelle
Wenn ich os.path.split () benutze, bekomme ich, ( d:\\stuff, morestuff\x0curtherdown\thefile.mux)
BeeBand
Wie BeeBand betonte, macht os.path.split () wirklich nicht das gewünschte.
Entspannen Sie
Entschuldigung, ich habe gerade festgestellt, dass os.path nur abhängig von Ihrem Betriebssystem funktioniert. ntpath analysiert dos-Pfade.
Deft_code
Selbst mit ntpath bekomme ich nochd:\\stuff, morestuff\x0curtherdown\thefile.mux
BeeBand
2
@BeeBand: Sie haben Probleme mit dem Entkommen Ihrer Zeichenfolge. '\x0c'ist das Formular-Feed-Zeichen. Die Art und Weise, das Formular-Feed-Zeichen zu erstellen, ist '\ f'. Wenn Sie die Literalzeichenfolge '\ f' wirklich wollen, haben Sie zwei Möglichkeiten: '\\f'oder r'\f'.
Deft_code