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 var
Pfads, 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.
os.path.split
dies bei Ihnen nicht funktioniert, da Sie dieser Zeichenfolge nicht ordnungsgemäß entkommen.r"d:\stuff\morestuff\furtherdown\THEFILE.txt"
, um\s
Fehlinterpretationen zu vermeiden .Antworten:
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.path
und 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:
Holen Sie sich den Pfad und die Datei:
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:
(Dies erscheint
"\"
am Anfang,folders
wenn der Pfad ursprünglich absolut war. Sie könnten ein bisschen Code verlieren, wenn Sie das nicht wollten.)quelle
if path.endswith("/"):
undpath = path[:-1]
.Ich würde es tun
Normalisieren Sie zuerst die Pfadzeichenfolge in eine geeignete Zeichenfolge für das Betriebssystem. Dann
os.sep
muss es sicher sein, als Trennzeichen bei der Aufteilung von Zeichenfolgenfunktionen verwendet zu werden.quelle
os.path.normpath(a_path).split(os.path.sep)
os.path.normpath(path).lstrip(os.path.sep).split(os.path.sep)
normpath
Schrägstrich als Trennzeichen erkannt. Unter Linuxnormpath
wird einfach davon ausgegangen, dass Sie ein Verzeichnis namens\1\2
und eine Datei oder ein Verzeichnis darin aufgerufen haben3
.Sie können einfach den pythonischsten Ansatz (IMHO) verwenden:
Welches wird Ihnen geben:
Der Hinweis hier ist,
os.sep
anstelle 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:
quelle
some times
. In anderen Fällen (zumindest unter Windows) finden Sie Pfade, die aussehenfolder\folder2\folder3/file.txt
. Es ist besser, zuerst den Pfad zu normalisieren (os.path.normpath) und diesen dann aufzuteilen./foo//bar
. B. ) zum Scheitern verurteilt . Siehe Tompa ‚s Antwort für eine robustere Lösung.In Python> = 3.4 ist dies viel einfacher geworden. Sie können jetzt
pathlib.Path.parts
alle Teile eines Pfads abrufen.Beispiel:
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.PurePosixPath
oderpathlib.PureWindowsPath
nach Bedarf:Bearbeiten: Es gibt auch einen Backport zu Python 2: pathlib2
quelle
Das Problem beginnt hier zunächst damit, wie Sie die Zeichenfolge erstellen.
Geschah diese Weise wird versucht , Python zu speziellem Fall dieser:
\s
,\m
,\f
, und\T
. In Ihrem Fall\f
wird es als Formfeed (0x0C) behandelt, während die anderen Backslashes korrekt behandelt werden. Was Sie tun müssen, ist eine der folgenden:Sobald Sie eine dieser Optionen aufgeteilt haben, erhalten Sie das gewünschte Ergebnis.
quelle
split()
oderreplace()
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 nursplit()
falsch verwendet. Weil ich einige dieser Lösungen ausprobiert habesplit()
und sie jetzt für mich funktionieren.Beachten Sie für eine etwas präzisere Lösung Folgendes:
quelle
/
. Außerdem erhalten Sie eine leere Zeichenfolge am Anfang der Liste, wenn Ihr Pfad mit/
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.
quelle
Der funktionale Weg mit einem Generator .
In Aktion:
quelle
Für mich geht das:
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
r
Modifikator markiert das Zeichenfolgenliteral als "raw". Beachten Sie, dass eingebettete Backslashes nicht verdoppelt werden.quelle
r
vor deinem String, worauf bezieht sich das?\
Zeichen maskiert . Es ist nützlich, wenn Sie Pfade ausführen.os.path.split
undos.pathsep
dass 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.Das Zeug über ungefähr
mypath.split("\\")
würde besser ausgedrückt werden alsmypath.split(os.sep)
.sep
ist 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 verwendensep
, ist Ihr Code plattformunabhängig.quelle
os.path.split
. Sie möchten vorsichtig seinos.pathsep
, da es sich:
um meine Python-Version in OS X handelt (undos.path.split
ordnungsgemäß verarbeitet wird/
).os.sep
nichtos.pathsep
. Befolgen Sie die Anweisungen in denos.sep
Dokumenten: 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 ().re.split () kann etwas mehr helfen als string.split ()
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 /'
quelle
Sie können
os.path.split
die Zeichenfolge rekursiv ausführenTesten Sie dies anhand einiger Pfadzeichenfolgen und setzen Sie den Pfad mit neu zusammen
os.path.join
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.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.
quelle
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 werdenr
, wie sor'lite\ral'
oderr"lite\ral"
den Parser zu vermeiden , die Umwandlung dieser\
undr
CR (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: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öchtenos
.quelle
var = var.replace('\\','/')
Angenommen, Sie haben eine Datei
filedata.txt
mit Inhalten:Sie können die Dateipfade lesen und teilen:
quelle
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 :)
Also für '\\\\ Server \\ Ordner1 \\ Ordner2 \\ Ordner3 \\ Ordner4'
du erhältst
['Server', 'Ordner1', 'Ordner2', 'Ordner3', 'Ordner4']
quelle
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 wasos.path.split()
macht.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.
quelle
Die folgende Codezeile kann Folgendes verarbeiten:
path = re.split (r '[/// \]', path)
quelle
Eine rekursive für den Spaß.
Nicht die eleganteste Antwort, sollte aber überall funktionieren:
quelle
verwenden
ntpath.split()
quelle
d:\\stuff
,morestuff\x0curtherdown\thefile.mux
)d:\\stuff, morestuff\x0curtherdown\thefile.mux
'\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'
oderr'\f'
.