Die Verwendung von os.path.split
oder os.path.basename
wie von anderen vorgeschlagen, funktioniert nicht in allen Fällen: Wenn Sie das Skript unter Linux ausführen und versuchen, einen klassischen Windows-Pfad zu verarbeiten, schlägt dies fehl.
Windows-Pfade können entweder einen Schrägstrich oder einen Schrägstrich als Pfadtrennzeichen verwenden. Daher ntpath
funktioniert das Modul (das unter Windows os.path entspricht) für alle (1) Pfade auf allen Plattformen.
import ntpath
ntpath.basename("a/b/c")
Wenn die Datei mit einem Schrägstrich endet, ist der Basisname natürlich leer. Erstellen Sie also Ihre eigene Funktion, um damit umzugehen:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Nachprüfung:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
(1) Es gibt eine Einschränkung: Linux-Dateinamen können Backslashes enthalten . Unter Linux wird also r'a/b\c'
immer auf die Datei b\c
im a
Ordner verwiesen, während unter Windows immer auf die c
Datei im b
Unterordner des a
Ordners verwiesen wird. Also , wenn beide vorwärts und rückwärts Schrägstriche in einem Pfad verwendet werden, Sie müssen die zugehörige Plattform kennen, um es richtig zu interpretieren. In der Praxis ist es normalerweise sicher anzunehmen, dass es sich um einen Windows-Pfad handelt, da Backslashes in Linux-Dateinamen selten verwendet werden. Beachten Sie dies jedoch beim Codieren, damit keine versehentlichen Sicherheitslücken entstehen.
os.path
Lädt dasntpath
Modul unter Windows nur intern. Mit diesem Modul ist es möglich, die'\\'
Pfadtrennzeichen auch auf Linux-Computern zu handhaben . Unter Linux vereinfacht dasposixpath
Modul (bzw.os.path
) die Pfadoperationen, um nur'/'
Trennzeichen im Posix-Stil zuzulassen .r'C:\path\to\file.txt'
) auf einem Linux-Computer analysieren müssen , müssen Sie das ntpath-Modul verwenden. Andernfalls können Sie die Funktionen von os.path verwenden. Dies liegt daran, dass Linux-Systeme normalerweise die Verwendung der Backslash-Zeichen in Dateinamen zulassen (wie in der Antwort erläutert).os.path.basename(os.path.normpath(path))
?Tatsächlich gibt es eine Funktion , die genau das zurückgibt, was Sie wollen
quelle
os.path.basename(your_path)
Das hat funktioniert! Ich wollte Skriptpfad:os.path.dirname(os.path.realpath(__file__))
und Skriptname :os.path.basename(os.path.realpath(__file__))
. Vielen Dank!'C:\\temp\\bla.txt'
stattdessen bekommen .os.path.split ist die Funktion, nach der Sie suchen
quelle
In Python 3
quelle
Schwanz ist was du willst, der Dateiname.
Weitere Informationen finden Sie in den Dokumenten zum Python OS-Modul
quelle
quelle
In Ihrem Beispiel müssen Sie auch den Schrägstrich von rechts auf der rechten Seite entfernen, um zurückzukehren
c
:Zweites Level:
Update: Ich denke,
lazyr
hat die richtige Antwort geliefert. Mein Code funktioniert nicht mit Windows-ähnlichen Pfaden auf Unix-Systemen und umgekehrt mit Unix-ähnlichen Pfaden auf Windows-Systemen.quelle
r"a\b\c"
unter Linux noch"a/b/c"
unter Windows.os.path.basename(path)
funktioniert natürlich nur wenn esos.path.isfile(path)
istTrue
. Daherpath = 'a/b/c/'
ist überhaupt kein gültiger Dateiname ...os.path.basename("a/b/c/")
kehrt""
wegen des abschließenden Schrägstrichs zurück.lazyr
Sie haben Recht! Daran habe ich nicht gedacht. Wäre es sicher, es einfach zu tunpath = path.replace('\\', '/')
?Dies wird zurückgeben: paint.exe
quelle
fname = str(path).split('/')[-1]
Wenn Sie den Dateinamen automatisch erhalten möchten, können Sie dies tun
quelle
Wenn Ihr Dateipfad nicht mit "/" und durch "/" getrennten Verzeichnissen endet, verwenden Sie den folgenden Code. Wie wir allgemein wissen, endet der Pfad nicht mit "/".
In einigen Fällen, in denen URLs mit "/" enden, wird der folgende Code verwendet
Wenn Ihr Pfad jedoch durch "\" getrennt ist, was Sie normalerweise in Windows-Pfaden finden, können Sie die folgenden Codes verwenden
Sie können beide zu einer Funktion kombinieren, indem Sie den Betriebssystemtyp überprüfen und das Ergebnis zurückgeben.
quelle
Dies funktioniert auch für Linux und Windows mit Standardbibliothek
Ergebnisse:
quelle
Hier ist eine reine Regex-Lösung, die mit jedem Betriebssystempfad auf jedem Betriebssystem zu funktionieren scheint.
Es wird kein anderes Modul benötigt und es ist auch keine Vorverarbeitung erforderlich:
Aktualisieren:
Wenn Sie nur einen potenziellen Dateinamen wünschen , falls vorhanden (dh ein Verzeichnis
/a/b/
und so istc:\windows\
), ändern Sie den regulären Ausdruck in :r'[^\\/]+(?![\\/])$'
. Für den "herausgeforderten regulären Ausdruck" ändert dies den positiven Forward-Lookahead für eine Art Schrägstrich in einen negativen Forward-Lookahead, wodurch Pfadnamen, die mit diesem Schrägstrich enden, nichts anstelle des letzten Unterverzeichnisses im Pfadnamen zurückgeben. Natürlich gibt es keine Garantie dafür, dass sich der potenzielle Dateiname tatsächlich auf eine Datei bezieht und dafür verwendet werden müssteos.path.is_dir()
oderos.path.is_file()
müsste.Dies wird wie folgt übereinstimmen:
Der Regex kann hier getestet werden .
quelle
Vielleicht nur meine All-in-One-Lösung ohne wichtige neue (siehe Tempfile zum Erstellen temporärer Dateien: D)
Das Erhalten der Werte von
abc.name
wird eine Zeichenfolge wie die folgende sein:'/tmp/tmpks5oksk7'
Also kann ich die/
durch ein Leerzeichen ersetzen.replace("/", " ")
und dann aufrufensplit()
. Das gibt eine Liste zurück und ich bekomme das letzte Element der Liste mit[-1]
Es muss kein Modul importiert werden.
quelle
Ich habe noch nie Pfade mit doppeltem Schrägstrich gesehen. Gibt es sie? Die integrierte Funktion des Python-Moduls
os
schlägt für diese fehl. Alle anderen arbeiten, auch die von Ihnen gegebene Einschränkung mitos.path.normpath()
:quelle
Das Windows-Trennzeichen kann sich in einem Unix-Dateinamen oder einem Windows-Pfad befinden. Das Unix-Trennzeichen kann nur im Unix-Pfad vorhanden sein. Das Vorhandensein eines Unix-Trennzeichens weist auf einen Nicht-Windows-Pfad hin.
Im Folgenden wird das hintere Trennzeichen durch das betriebssystemspezifische Trennzeichen entfernt (abgeschnitten), dann geteilt und der Wert ganz rechts zurückgegeben. Es ist hässlich, aber einfach, basierend auf der obigen Annahme. Wenn die Annahme falsch ist, aktualisieren Sie bitte und ich werde diese Antwort aktualisieren, um den genaueren Bedingungen zu entsprechen.
Beispielcode:
quelle
Der Vollständigkeit halber ist hier die
pathlib
Lösung für Python 3.2+:Dies funktioniert sowohl unter Windows als auch unter Linux.
quelle
Verwenden Sie in Python 2 und 3 das Modul pathlib2 :
Verwendungszweck:
Mit Ihrem Testfall:
Hier geht es darum, alle Pfade in die einheitliche interne Darstellung von zu konvertieren
pathlib2
, wobei je nach Plattform unterschiedliche Decoder vorhanden sind. Glücklicherweisepathlib2
enthält ein generischer Decoder namensPurePath
, der auf jedem Pfad funktionieren sollte. Falls dies nicht funktioniert, können Sie die Erkennung des Windows-Pfads mithilfe von erzwingenfromwinpath=True
. Dadurch wird die Eingabezeichenfolge in Teile aufgeteilt. Das letzte ist das gesuchte Blatt, daher daspath2unix(t)[-1]
.Wenn das Argument verwendet wird
nojoin=False
, wird der Pfad wieder verknüpft, sodass die Ausgabe einfach die in ein Unix-Format konvertierte Eingabezeichenfolge ist. Dies kann hilfreich sein, um Unterpfade plattformübergreifend zu vergleichen.quelle