Gibt es eine Funktion zum Extrahieren der Erweiterung aus einem Dateinamen?
1300
Gibt es eine Funktion zum Extrahieren der Erweiterung aus einem Dateinamen?
Ja. Verwendung os.path.splitext
(siehe Python 2.X-Dokumentation oder Python 3.X-Dokumentation ):
>>> import os
>>> filename, file_extension = os.path.splitext('/path/to/somefile.ext')
>>> filename
'/path/to/somefile'
>>> file_extension
'.ext'
Im Gegensatz zu den meisten manuellen Versuchen zum Teilen von Zeichenfolgen os.path.splitext
wird korrekt behandelt /a/b.c/d
, dass keine Erweiterung statt Erweiterung vorhanden ist .c/d
, und es wird so behandelt .bashrc
, dass keine Erweiterung statt Erweiterung vorhanden ist .bashrc
:
>>> os.path.splitext('/a/b.c/d')
('/a/b.c/d', '')
>>> os.path.splitext('.bashrc')
('.bashrc', '')
basename
ist hier ein wenig verwirrend, da zurückkehrenos.path.basename("/path/to/somefile.ext")
würde"somefile.ext"
endswith()
tragbarer und pythonischer?.asd
ist das wirklich die Erweiterung !! Wenn Sie darüber nachdenken,foo.tar.gz
handelt es sich um eine gzip-komprimierte Datei (.gz
), die zufällig eine TAR-Datei (.tar
) ist. Aber es ist in erster Linie eine gzip-Datei . Ich würde nicht erwarten, dass es die doppelte Erweiterung überhaupt zurückgibt.splittext
. Wenn sie nur irgendetwas tun würden, um den Bruch zwischen Teilen dieses Namens zu kennzeichnen, wäre es viel einfacher zu erkennen, dass essplitExt
oder istsplit_ext
. Sicher kann ich nicht die einzige Person sein, die diesen Fehler gemacht hat?os.path.splitext('somefile.ext')
=>('somefile', '.ext')
. Geben Sie ein Beispiel für einen tatsächlichen Zähler an, ohne auf eine Bibliothek eines Drittanbieters zu verweisen.quelle
import os.path
statt warumfrom os import path
?from os import path
der Namepath
in Ihrem lokalen Bereich verwendet wird. Auch andere, die sich den Code ansehen, wissen möglicherweise nicht sofort, dass der Pfad der Pfad vom Betriebssystemmodul ist. Wo, als ob Sie es verwendenimport os.path
, bleibt es imos
Namespace und wo immer Sie den Anruf tätigen, wissen die Leute sofort, dass espath()
vomos
Modul stammt._, extension = os.path.splitext(filename)
viel schöner.if check_for_gzip and os.path.splitext(filename)[1] == '.gz':
Neu in Version 3.4.
Ich bin überrascht, dass noch niemand erwähnt
pathlib
hat,pathlib
IST großartig!Wenn Sie alle Suffixe benötigen (z. B. wenn Sie ein haben
.tar.gz
),.suffixes
wird eine Liste von ihnen zurückgegeben!quelle
''.join(pathlib.Path('somedir/file.tar.gz').suffixes)
.suffixes[-2:]
um sicherzustellen, dass höchstens .tar.gz angezeigt wird.Um nur den Text der Erweiterung ohne den Punkt zu erhalten.
quelle
Eine Option kann das Aufteilen vom Punkt sein:
Kein Fehler, wenn die Datei keine Erweiterung hat:
Aber Sie müssen vorsichtig sein:
quelle
"my.file.name.js".split('.') => ['my','file','name','js]
['file', 'tar', 'gz']
mit'file.tar.gz'.split('.')
vs['file.tar', 'gz']
mit'file.tar.gz'.rsplit('.', 1)
. Ja, könnte sein.Es lohnt sich, dort einen niedrigeren Wert hinzuzufügen, damit Sie sich nicht fragen, warum die JPGs nicht in Ihrer Liste angezeigt werden.
quelle
Alle oben genannten Lösungen funktionieren, aber unter Linux habe ich festgestellt, dass am Ende der Erweiterungszeichenfolge eine neue Zeile steht, die den Erfolg von Übereinstimmungen verhindert. Fügen Sie die
strip()
Methode am Ende hinzu. Zum Beispiel:quelle
[1:]
in.splittext(filename)[1][1:]
) - danke im Voraussplittext()
(anders als wenn Sie eine Zeichenfolge mit '.' Teilen) enthält das '.' Zeichen in der Erweiterung. Das zusätzliche[1:]
wird es los.Mit splitext gibt es Probleme mit Dateien mit doppelter Erweiterung (zB
file.tar.gz
,file.tar.bz2
, etc ..)sollte aber sein:
.tar.gz
Die möglichen Lösungen sind hier
quelle
gunzip somefile.tar.gz
Wie lautet der Ausgabedateiname?Im pathlib-Modul (verfügbar in Python 3.x) finden Sie einige großartige Dinge.
quelle
Es ist zwar ein altes Thema, aber ich frage mich, warum es in diesem Fall keine Erwähnung einer sehr einfachen Python-API namens rpartition gibt:
Um die Erweiterung eines bestimmten absoluten Dateipfads zu erhalten, können Sie einfach Folgendes eingeben:
Beispiel:
wird dir geben: 'csv'
quelle
("string before the right-most occurrence of the separator", "the separator itself", "the rest of the string")
. Wenn kein Trennzeichen gefunden wird, lautet das zurückgegebene Tupel :("", "", "the original string")
.Einfach
join
allespathlib suffixes
.quelle
Überrascht wurde dies noch nicht erwähnt:
Leistungen:
Als Funktion:
quelle
[-1]
dann.Sie können ein
split
auf einem verwendenfilename
:Dies erfordert keine zusätzliche Bibliothek
quelle
quelle
filename
zurückgegeben wird, wenn der Dateiname überhaupt keine hat.
. Dies liegt daran, dassrfind
zurückgegeben wird,-1
wenn die Zeichenfolge nicht gefunden wird.Dies ist eine direkte Zeichenfolgendarstellungstechnik: Ich sehe viele erwähnte Lösungen, aber ich denke, die meisten betrachten Split. Split tut dies jedoch bei jedem Auftreten von "." . Was Sie lieber suchen, ist Partition.
quelle
Eine andere Lösung mit Rechtsaufteilung:
quelle
Auch diese Frage ist bereits beantwortet. Ich würde die Lösung in Regex hinzufügen.
quelle
\.[0-9a-z]+$
wie in diesem Beitrag .Ein echter Einzeiler, wenn Sie Regex mögen. Und es spielt keine Rolle, auch wenn Sie zusätzliche "." mitten drin
Das Ergebnis finden Sie hier : Klicken Sie hier
quelle
Dies ist die einfachste Methode , um sowohl Dateiname als auch Erweiterung in nur einer Zeile abzurufen .
Im Gegensatz zu anderen Lösungen müssen Sie hierfür kein Paket importieren.
quelle
Zum Spaß ... sammle einfach die Erweiterungen in einem Diktat und verfolge sie alle in einem Ordner. Dann ziehen Sie einfach die gewünschten Erweiterungen.
quelle
Versuche dies:
quelle
foo.tar
ist ein gültiger Dateiname. Was passiert, wenn ich das auf deinen Code werfe? Was ist mit.bashrc
oderfoo
? Dafür gibt es aus einem bestimmten Grund eine Bibliotheksfunktion ...quelle
quelle
Dadurch erhalten Sie den Dateinamen bis zum ersten ".", Was am häufigsten vorkommt.
quelle
file.name.ext